一、原理
分水岭概念是以对图像进行三维可视化处理为基础:其中两个是坐标,另一个是灰度级。基于“地形学”的这种解释,考虑三类点:
a.属于局部性最小值的点,也可能存在一个最小值面,该平面内的都是最小值点;b.当一滴水放在某点的位置上的时候,水一定会下落到一个单一的最小值点;c.当水处在某个点的位置上时,水会等概率地流向不止一个这样的最小值点。
对一个特定的区域最小值,满足条件(b)的点的集合称为这个最小值的“汇水盆地”或“分水岭”。满足条件(c)的点的集合组成地形表面的峰线,称做“分割线”或“分水线”。
把图像看作是测地学上的拓扑地貌,图像中每一点像素的灰度值表示该点的海拔高度,基本思想是:假设在每个区域最小值的位置上打一个洞并且让水以均匀的上升速率从洞中涌出,从低到高淹没整个地形。当处在不同的汇聚盆地中的水将要聚合在一起时,修建的大坝将阻止聚合。水将达到在水线上只能见到各个水坝的顶部这样一个程度。这些大坝的边界对应于分水岭的分割线。所以,它们是由分水岭算法提取出来的(连续的)边界线。
标记分水岭分割就是在使用分水岭算法之前的预处理阶段加入一种标记技术,并将标记运用到整个分割过程中,从而对区域数目进行严格控制来防止过分割现象。标记分为外部标记和内部标记,内部标记处于每一个目标区域,外部标记即为背景。基于标记控制的分水岭分割方法的基本步骤如下:
- 计算分割函数:图像中较暗的区域是要分割的对象。
- 计算前景标志:这些是每个对象内部连接的斑点像素。
- 计算背景标志:这些是不属于任何对象的像素。
- 修改分割函数,使其仅在前景和后景标记位置有极小值。
- 对修改后的分割函数做分水岭变换计算。
二、matlab代码
代码如下
I=imread('cameraman.tif');
L=watershed(I);
rgb = label2rgb(L);
figure, imshow(rgb,'InitialMagnification','fit'); title('分水岭')
分水岭分割结果如下