1)分水岭算法
原理:
任何一幅灰度图像都可以被看成是拓扑平面,灰度值高的区域可以被看成是山峰,灰度值低的区域可以被看成是山谷,我们向每一个山谷中灌不同颜色的水,随着水位的升高,不同山谷的水就会相遇汇合,为了防止不同山谷的水的汇合,我们需要在水汇合的地方构建起堤坝,不停的灌水,不停的构建堤坝直到所有的山峰都被水淹没,我们构建好的堤坝就是对图像的分割,这就是分水岭算法的背后原理
对灰度图的地形学解释,我们考虑三类点
1 局部最小值点,该点对应一个盆地里滴一滴水的时候,由于重力作用,水最终会汇聚到该点,注意,可能存在一个最小值面,该平面内都是最小值点
2 盆地的其他位置点,该位置滴的水滴会汇聚到局部最小点
3 盆地的边缘点,是该盆地和其他盆地交接点,在该点滴一滴水,会等概率的流向任何一个盆地


在真实图像中,由于噪声点或者其他干扰因素的存在,使用分水岭算法常常存在过度分割的现象,这是因为很多很小的局部极值点的存在
为了解决过度分割的问题,可以使用基于标记(mark)图像的分水岭算法,就是通过先验知识(常识),来指导分水岭算法,以便获得更好的图像分段效果,通常的mark图像,都是在某个区域定义了一些灰度层级,在这个区域的洪水淹没过程中,水平面都是从定义的高度开始的,这样可以避免一些很小的噪声极值区域的分割
就是开始从标记处分割


分水岭算法–watershed()
void watershed(InputArray image,InputOutputArray markers);
&&image:输入图像,需为8位三通道彩色图像
&&markers:参数调用后的结果,输入/输出32位单通道图像标记结果,需和原图一样的大小

Mat srcImg=imread("bird.jpg");
imshow("src",srcImg);
Mat dstImg=srcImg.clone();
//medianBlur(srcImg,srcImg,5);
//GaussianBlur(srcImg,srcImg,Size(5,5),0,0);
Mat imgMask(srcImg.size(),CV_8U,Scalar(0));
//标记背景图像
rectangle(imgMask,Point(1,1),Point(srcImg.cols-2,srcImg.row-2),Scalar(255),1);
//标记鸟       画图工具框出坐标
recctangle(imgMask,Point(srcImg.cols/2-10,srcImg.rows/2-10),Point(srcImg.cols/2+10,srcImg.rows/2+10),CV::Scalar(128),10);
//标记岩石
rectangle(imgMask,Point(264,353),Point(314,395),cv::Scalar(64),10);
imshow("mask",imgMask);
imgMask.convertTo(imgMask,CV_32S);//转化类型
watershed(srcImg,imgMask);
Mat mark1,mark2;
imgMask.convertTo(mark1,CV_8U);
imshow("marker",mark1);

图像修补
Opencv中图像修补技术由inpaint函数实现,基本步骤是先修复区域边缘再逐步向内推进修复,可以用来清除照片灰尘,划痕,或者从静态图像及视频中去除不需要的物体
图像修补—inpaint()
void inpaint(InputArray src,InputArray inpaintMask,OutputArray dst,double inpaintRadius,int flags);
&& src:输入图像,需为8位单通道或三通道色图像
&&inpainMask:修复掩膜,为8位单通道图像,其中非0像素表示需要修补的区域
&&dst:函数调用后输出图像,和原图一样的尺寸和类型
&&InpaintRadius:需要修补的每个点的圆形邻域,为修复算法的参考半径
&&flags:修补方法的标识符
INPAINT_NS=CV_INPAINT_NS,
INPAINT_TELEA=CV_INPAINT_TELEA
基于Navier_Stokes方程方法和Alexandru Telea
注:需要添加opencv_photo248d.lib与photo.hpp

属性管理器 链接器opencv_photo248d.lib


opencv之分水岭算法分割及图像修补相关推荐

  1. OpenCV4.5.5学习笔记(十七):分水岭算法watershed(),图像修补inpaint()

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.分水岭算法watershed() 二.图像修补inpaint() 总结 前言 笔者本科时候有幸接触了OpenCV3 ...

  2. pythonopencv算法_python opencv之分水岭算法示例

    本文介绍了python opencv之分水岭算法示例,分享给大家,具体如下: 目标 使用分水岭算法对基于标记的图像进行分割 使用函数cv2.watershed() 原理: 灰度图像可以被看成拓扑平面, ...

  3. 使用OpenCV的分水岭算法

    <使用OpenCV的分水岭算法>   之前利用watershed想对相对前背景较为明显的图像进行图像语义分割的预打标,因为虽然前景明显,但是边缘打标也是很困难的,可以用该方法对大部分的边缘 ...

  4. opencv实现分水岭算法

    opencv实现分水岭算法 // 分水岭算法原理 // IplImage* marker_mask = 0; IplImage* markers = 0; //IplImage* img0 = 0, ...

  5. 分水岭算法分割图像的原理概述及OpenCV代码实现

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 前面博文中提到的图像阈值化,图像边缘检测,图像轮 ...

  6. Python OpenCV分水岭算法分割和提取重叠或有衔接的图像中的对象

    本文将介绍如何使用分水岭算法对触摸和重叠的图像中的对象进行分割和提取. 参考:https://www.pyimagesearch.com/2015/11/02/watershed-opencv/ 分水 ...

  7. Python OpenCV学习笔记之:分水岭算法分割图像

    为什么80%的码农都做不了架构师?>>>    # -*- coding: utf-8 -*- """ 图像分水岭分割图像 分水岭算法可以参考:http ...

  8. python opencv 利用分水岭算法实现对物体的分割 图文详细注释版 以分割官网提供的硬币为例

    分水岭算法可以实现自动分割多个物体,opencv中 cv.watershed() 函数实现了分水岭算法 话不多说,上代码 # 利用分水岭算法分离多个相同硬币 import numpy as np im ...

  9. 【OpenCV】- 分水岭算法

    文章目录 什么是图像分割 分水岭算法 1.实现分水岭算法:watershed()函数 2.处理流程(视频) 3.示例程序(书中) 什么是图像分割 将图像中像素根据一定的规则分为若干个cluster集合 ...

最新文章

  1. 理解面向过程和面向对象的程序设计方法
  2. 子组件自动执行方法_【自动化程序的最佳实践】 04 自动化程序的生命周期
  3. python学费多少-2020年10月徐州学python要多少学费
  4. socket websocket
  5. 五分钟,手撸一个Spring容器!
  6. app分发源码_第三方苹果企业签名源码
  7. 如果华为完全没办法买到芯片,是否可以尝试做无芯手机?
  8. Zabbix自带模板监控MySQL服务
  9. 《赢在中国》第二赛季108将进京
  10. AngularJS 控制器 ng-controller
  11. SVProgressHUD 的显示时间
  12. 解决onenote同步慢的问题
  13. matlab求逆函数— inv函数
  14. 【QCM2150】WFA 11ac 4.2.43测试失败及解决方案
  15. 音频转化mp3 ,到底选vbr还是cbr
  16. 计算机任务计划程序已损坏,win7系统弹出任务计划程序窗口显示该任务映像损坏或已篡改0x80041321错误代码的解决方法...
  17. 山东大学软件学院项目实训-创新实训-网络安全靶场实验平台(十六)
  18. Python之——UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 0 解决办法
  19. MacbookPro 2015 13-ich 成功更换硬盘的方案(intel 760p 1T)
  20. php仿站教程网,我想仿站,不知道选择哪个cms好?

热门文章

  1. 记录基于STM32的独轮车测试板构建(一)电机篇
  2. mysql的mvvm_MVC、MVP、MVVM模式的概念与区别
  3. 《机器学习工程师》朴素贝叶斯
  4. 关于孩子的教育,心理健康教育值得我们重视
  5. Shader常用函数(floor,ceil,degrees,fmod,round,saturate)
  6. 二进制、八进制、十进制、十六进制之间的转换(图文解释)
  7. 计算机显示发送报告,Win10系统如何查询计算机问题报告
  8. ubuntu输入法的设置
  9. c语言格式字符使用举例,c语言char怎么用
  10. 扫地机器人发火_盘点扫地机器人那些让人吐血三升的事,你有遇到过吗?