前言
分水岭算法主要用于图像的分割!
这个算法需要输入一个灰度图,在接下来的洪水漫堤过程中,相邻的积水盆地之间的分水岭便慢慢构建起来。一般情况下,这会引起过分割,尤其是具有噪声的图像。
图像必须要预处理,以消除噪声;分割结果必须要基于一些根据进行区域合并,以减小过分割造成的影响!
技术
假设我们要将下面这幅图像进行分割,需要几步?分三步,第一步,冰箱门打开,第二步。。。打住,- -| 进入正题,我们要用OpenCV来实现,不就一步么?调用那个watershed函数不就行了?实际上,可没那么简单!且听我细细道来 ~-~!
OpenCV实现了一个基于标记图层的分水岭算法,所谓基于标记图层,就是不用手动选择种子点了,直接输入一个包含标记点(种子点)的图像即可。函数原型如下:
C++: void watershed(InputArray image, InputOutputArray markers)
其中,image代表输入图像(必须是8-bit3通道图像