Opencv(C++)笔记--利用分水岭算法实现图像分割

1--分水岭算法的原理

详细原理讲解可参考:博客1和视频1;

原理简述:分水岭算法的基本思想是把图像视为拓扑地貌,图像中每一点像素的灰度值表示该点的海拔高度,每一个局部极小值及其影响区域称为集水盆,而两个集水盆之间的边界则形成分水岭。分水岭的概念和形成可以通过模拟浸入过程来说明:在每一个局部极小值表面,刺穿一个小孔,然后把整个模型慢慢浸入水中,随着浸入水的加深,每一个局部极小值的影响域慢慢向外扩展,在两个集水盆汇合处构筑大坝,即形成分水岭。

2--OpenCV API

Opencv(C++)笔记--利用分水岭算法实现图像分割_第1张图片

函数 cv::watershed() 实现的分水岭算法是基于标记的分割算法。在把源图像传给函数之前,需要大致勾画标记出图像期望分割的区域。

3--代码实例

3-1--OpenCV处理流程:

① 背景转换:白色背景转换为黑色背景;

② 图像锐化:利用拉普拉斯算子模糊处理图像,将源图像减去模糊图像;

③ 距离变换:对锐化后的图像进行距离变换,基于cv::distanceTransform() 计算源图像的每个像素到最近的零像素的距离;

④ 生成标记:通过二值化、腐蚀、轮廓检测等生成图像标记;

⑤ 分水岭变换:基于cv::watershed() 使用源图像和标记图像实现分水岭变换;

⑥ 填充:对分割得到的对象进行颜色填充;

前4步可以理解为:将源图像期望分割的区域进行标记出来。

3-2--完整代码

补充说明:如果要展示标记图像,需要将markers转换为CV_8U,否则会报错。

3-3--结果展示

Opencv(C++)笔记--利用分水岭算法实现图像分割_第2张图片
Opencv(C++)笔记--利用分水岭算法实现图像分割_第3张图片

你可能感兴趣的:(Opencv(C++)学习笔记,c++,开发语言)