分水岭算法不是第一次看见了,因为项目中没用过,就一直没详细看里面标记图的用法,而且感觉看过的OpenCV书里面解释的都很不明白,其实是自己的学习方法有问题,这个问题说简单也很简单,一步步的试验看看中间输出结果,还有什么难的呢。
下面进入正题,首先这个标记图作用是什么(分水岭算法原理这里就不说了),在一些分割算法如watershed和grabCut算法中,如果直接对原图进行处理,那么将图像过度分割为许多微小的区域,为了避免这种过度分割,就是用标记图来引导,标记图里面表示为前景的部分,分水岭算法就在它的附近进行精准的分割,标记图里面标记为背景的部分,分水岭算法就不管它了。那么这个标记图如何形成呢,概况来说就是把前景图像内的任意某一部分设为255,背景图像设为0到255中间某值,未知图像设为0,而一种常用的方法是对图像A取二值化得到图像B,前景设为高亮,二值化后的图像进行腐蚀得到图像M,这也就是得到了前景的一部分,然后同样是对二值化图像B,进行膨胀,然后把膨胀后的图像C再进行二值化得到N,这个N是把C里面的背景(也就是 C里面的零值区域)设为128,前景设为0得到,最后把M和N相加,就得到了标记图,把这个标记图作为分水岭算法的输入参数,就可以得到理想的结果。
以下附上得到标记图的过程: