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

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

笔者本科时候有幸接触了OpenCV3.2.0版本的学习,后因考研压力不得不暂时停下学习的脚步,现在考研任务结束了,未来的导师也是从事的该方向,笔者又开始了新一轮的学习。回来发现OpenCV已经出到了4.5.5版本,遂重新下载新版本并决定记录这一学习历程。由于笔者水平有限,可能有错误之处还请诸位大佬多多包涵并烦请指出,让我们一起学习,共同进步。
首先需要说明的是:我是按着毛星云前辈编写的OpenCV3编程入门进行学习的,我会尽力把星云前辈的程序转成符合OpenCV4.5.5版本的。毛星云前辈于2021年12月11日不幸过世,他是我非常敬仰的一位业内大佬,我也是看他的书才开始接触OpenCV。


一、分水岭算法watershed()

在许多实际运用中,我们需要分割图像,但无法从背景图像中获得有用信息。分水岭算法在这方面往往是非常有效的。此算法可以将图像中的边缘转化成“山脉”,将均匀区域转化为“山谷”,这样有助于分割目标。
分水岭算法,是一种基于拓扑理论的数学形态学的分割方法,其基本思想是把图像看作是测地学上的拓扑地貌,图像中每一点像素的灰度值表示该点的海拔高度,每一个局部极小值及其影响区域称为集水盆,而集水盆的边界则形成分水岭。分水岭的概念和形成可以通过模拟浸入过程来说明在每一个局部极小值表面,刺穿一个小孔,然后把整个模型慢慢浸入水中,随着浸入的加深,每一个局部极小值的影响域慢慢向外扩展,在两个集水盆汇合处构筑大坝,即形成分水岭。
在将图像传递给函数之前,您必须用正 (>0) 索引粗略地勾勒出图像标记中所需的区域。因此,每个区域都表示为一个或多个具有像素值 1、2、3 等的连通分量。可以使用findContours和drawContours从二进制掩码中检索此类标记(。标记是未来图像区域的“种子”。标记中的所有其他像素,其与轮廓区域的关系未知,应由算法定义,应设置为 0。在函数输出中,标记中的每个像素都设置为“种子”组件的值,或者在区域之间的边界处设置为 -1。
我们常用的是watershed()函数
在OpenCV官方文档中是这么写的:
void cv::watershed (
InputArray image,
InputOutputArray markers
)
第一个参数是输入 8 位 3 通道图像,
第二个参数是输入/输出标记的 32 位单通道图像(地图)。它应该与 image 具有相同的大小


二、图像修补inpaint()

使用区域邻域恢复图像中的选定区域。

我们常用的是inpaint()函数
在OpenCV官方文档中是这么写的:
void cv::inpaint (
InputArray src,
InputArray inpaintMask,
OutputArray dst,
double inpaintRadius,
int flags
)
第一个参数是输入 8 位、16 位无符号或 32 位浮点 1 通道或 8 位 3 通道图像,
第二个参数是修复蒙版,8 位 1 通道图像。非零像素表示需要修复的区域,
第三个参数是输出与 src 大小和类型相同的图像,
第四个参数是算法考虑的每个修复点的圆形邻域的半径,
第五个参数是cv::INPAINT_NS或cv::INPAINT_TELEA的修复方法


总结

分水岭函数程序运行效果图:
在这里插入图片描述
图像修补函数运行效果图(原图):

在这里插入图片描述
图像修补函数运行效果图(破坏图与修复图):
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43264167/article/details/124540015