分水岭算法主要用于图像分段,一般是把一副彩色图像灰度化,而后再求梯度图,最后在梯度图的基础上进行分水岭算法,求得分段图像的边缘线。算法
下面左边的灰度图,能够描述为右边的地形图,地形的高度是由灰度图的灰度值决定,灰度为0对应地形图的地面,灰度值最大的像素对应地形图的最高点。编程
咱们能够本身编程实现灰度图的地形图显示,工程FirstOpenCV6就实现了简单的这个功能,好比上边的灰度图,显示为:3d
对灰度图的地形学解释,咱们咱们考虑三类点:blog
1. 局部最小值点,该点对应一个盆地的最低点,当咱们在盆地里滴一滴水的时候,因为重力做用,水最终会汇聚到该点。注意:可能存在一个最小值面,该平面内的都是最小值点。get
2. 盆地的其它位置点,该位置滴的水滴会汇聚到局部最小点。it
3. 盆地的边缘点,是该盆地和其它盆地交接点,在该点滴一滴水,会等几率的流向任何一个盆地。基础
假设咱们在盆地的最小值点,打一个洞,而后往盆地里面注水,并阻止两个盆地的水聚集,咱们会在两个盆地的水聚集的时刻,在交接的边缘线上(也即分水岭线),建一个坝,来阻止两个盆地的水聚集成一片水域。这样图像就被分红2个像素集,一个是注水盆地像素集,一个是分水岭线像素集。bfc
下面的gif图很好的演示了分水岭算法的效果:im
在真实图像中,因为噪声点或者其它干扰因素的存在,使用分水岭算法经常存在过分分割的现象,这是由于不少很小的局部极值点的存在,好比下面的图像,这样的分割效果是毫无用处的。d3
为了解决过分分割的问题,可使用基于标记(mark)图像的分水岭算法,就是经过先验知识,来指导分水岭算法,以便得到更好的图像分段效果。一般的mark图像,都是在某个区域定义了一些灰度层级,在这个区域的洪水淹没过程当中,水平面都是从定义的高度开始的,这样能够避免一些很小的噪声极值区域的分割。
下面的gif图很好的演示了基于mark的分水岭算法过程:
上面的过分分段图像,咱们经过指定mark区域,能够获得很好的分段效果: