分水岭算法可以用来快速分割图像成为同类区域
原理概述:将图像视为拓扑结构的地图,均质区域就是被陡峭边缘包围的平坦盆地,因而,可以选出较为平坦的区域。
分水岭分割的结果通过cv::watershed函数获取,在这里,我们创建一个WatershedSegmenter类,进行分水岭算法的封装工作。
整体算法概述:
在选取的图像中,我们先进行二值化操作,操作争取将前景物体最大可能性提出。
之后,多次采用腐蚀的方法得到目标的前景图片,这个前景图片就只有0和255两个灰度值;
再多次使用膨胀的方法得到目标的背景图片,在之后使灰度图中高于128灰度的像素变为0,低于的部分为128(采用threshold);
之后,将前景背景相加,得到一张标记图,这张标记图就只有0,128,255三个灰度值。
之后,就可以得到图片了。
啥也不说,上代码。
分水岭算法概述:
1.一张灰度图,我们先将灰度值想象成柱状图,那么我们就能得到一张三维的灰度柱状图分布表。
2.如上所述,二值化后的图片只有0,128,255的几个值。
3.也就是说,腐蚀过后的图片是我们的前景图片,只有0和255这两个值,在三维图上,255的选定区域是最高的山峰,也就是标记区域,代表着目标图像。
膨胀+二值化选取之后的图像拥有128和0两个值,0对应的是目标图像的区域,12