分水岭算法是一个流行的图像处理算法,用于快速地分割图像为同类区域。它背后的原理就是,如果将图像视为拓扑结构的地图,那么均质区域对应的是被陡峭边缘包围的平坦盆地。这么讲,可能大家还不是很明白,接下来我们详细地分析一下这个算法。
——————————————————————————————
分水岭算法的思想来源于地形学,它将图像看作是地形学上被水覆盖的自然地貌,图像中的每一像素的灰度值表示该点的海拔高度,其每一个局部极小值及其影响区域称为集水盆地,两集水盆地的边界则为分水岭(或理解成:图像中区域边缘对应于高的分水岭线,而低梯度的区域内部对应于集水盆地)。通常描述分水岭变换有两种方法:一种是“雨滴法”,即当一滴雨水分别从地形表面的不同位置开始下滑,其最终将流向不同的局部海拔高度最低的区域(称为极小区域),那些汇聚到同一个极小区域的雨滴轨迹就形成了一个连通区域,称为集水盆地;另一种方法[1]是模拟“溢流”的过程,即首先在各极小区域的表面打一个小孔,同时让泉水从小孔中涌出,并慢慢淹没极小区域周围的区域,那么各极小区域波及的范围,即是相应的集水盆地。无论是哪种方法,不同区域的水流相遇时的界限,就是期望得到的分水岭。 应用到图像分割中,分水岭算法是指将原图像转换成一个标记图像,其中所有属于同一集水盆的点均被赋予同一个标记,并用一个特殊的标记来标识分水岭上的点。
分水岭算法在图像分割中是一种基于区域的分割方法,与那些以寻找区域间的边界为目标的图像分割方法不同,分水岭算法是直接构造区域,从而实现图像分割。这种方法是将图像划分为最大一致性的分区。一致性是区域的一个重要性质,在区域增长中用作主要的分割准则。在分水岭分割中,地形表面的集水盆地在如下含义下是一致的:同一集水盆地的所有像素都与该盆地的最小灰度区域有一条像素的简单路径相连,沿着该路径的灰度是单调减的。这样的集水盆地表示了分割后图像的区域。
下面来一张图增加感性认识:
根据分水岭算法的原理,令M1、M2、M3、…、Mr表示待分割图像的极小区域(即待分割图像中局部最小值点的坐标的集合),C(Mi)表示与极小区域Mi相关的流域(集水盆内的点都组成一个连通分量),min和max分别表示梯度的极小值和极大值(即待分割图像灰度值的极大值和极小值)。假设溢流过程都是以单灰度值增加的,n表示溢流的增加数值(即在第n步时溢流的深度),T[n]表示满足f(x)<n的所有点x的集合,以f(x)为梯度图像信号(即图像灰度值信号)。对于一个给定流域,在第n步将会出现不同程度的溢流(也可能不出现)。假设在第n步时极小区域Mi发生溢流,令Cn(Mi)为与极小区域Mi相关流域的一部分,即在溢流深度n时,在流域C(Mi)中形成的水平面构成的区域,Cn(Mi)为二值图像,可表示为:
Cn(Mi)=C(Mi)&T[n] (1) (即是说Cn(Mi)表示一个区域,它既是与Mi为极小值点的一个连通流域同时这个区域的灰度值小于n)
如果极小区域Mi的灰度值为n,则在第n+1步时,流域的溢流部分与极小区域完全相同,即有Cn+1(Mi)=Mi。
令C[n]表示第n步流域中溢流部分的并(即第n个阶段汇水盆地被水淹没的部分的合集),则C[max+1]为所有流域的并。
算法初始时取C[min+1]=T[min+1]。
溢流的定义是是递归的。假设C[n-1]已经建立。由式(1)可知,C[n]为T[n]的一个子集,又因为C[n-1]是C[n]的子集,故C[n-1]是T[n]的子集。如果D是T[n]的连通成分,将有3种可能:
1) D&C[n-1]为空;
2) D&C[n-1]为非空,含有C[n-1]一个连通成分;
3) D&C[n-1]为非空,含有C[n-1]多个连通成分。
当增长的溢流达到一个新的极小区域时,第1)种情况将会发生,则将D并入C[n-1]构成C[n]。对于第2)种可能,D将位于某个极小区域流域之
内。第3)种情况,D必定含有一些组成C[n-1]的部分流域Cn-1(Mi)。因此,在D内必须建一个堤坝,以防止溢流在单独的流域中溢出,该堤坝是T[n]内C[n-1]的测地SKIZH。C[n-1]构成C[n]时,每一个部分流域Cn-1(Mi)都在T[n]内增长成其测地影响区。
f = imread('E:\快盘资料\学习文档\冈萨雷斯数字图像处理 图像和代码\myimage\dipum_images_ch10\f1.tif'); figure,imshow(f); title('原始图像') f = double(f); g = im2bw(f,graythresh(f)); figure,imshow(g) title('二值图像') gc = ~g; figure,imshow(gc) title('图像的补') D = bwdist(gc); figure,imshow(D) title('') L = watershed(-D); w = L == 0; figure,imshow(w) g2 = g & ~w; figure,imshow(g2) title('最后的分水岭线')
%2-D Example %Make a binary image containing two overlapping circular objects. center1 = -10; center2 = -center1; dist = sqrt(2*(2*center1)^2); radius = dist/2 * 1.4; lims = [floor(center1-1.2*radius) ceil(center2+1.2*radius)]; [x,y] = meshgrid(lims(1):lims(2)); bw1 = sqrt((x-center1).^2 + (y-center1).^2) <= radius; bw2 = sqrt((x-center2).^2 + (y-center2).^2) <= radius; bw = bw1 | bw2; figure, imshow(bw,'InitialMagnification','fit'), title('bw') %Compute the distance transform of the complement of the binary image. D = bwdist(~bw); figure, imshow(D,[],'InitialMagnification','fit') title('Distance transform of ~bw') %Complement the distance transform, and force pixels that don't belong to the objects to be at -Inf. D = -D; D(~bw) = -Inf; %Compute the watershed transform and display the resulting label matrix as an RGB images. L = watershed(D); rgb = label2rgb(L,'jet',[.5 .5 .5]); figure, imshow(rgb,'InitialMagnification','fit') title('Watershed transform of D')
参考文献:
[1] Vincent L, Soille P. Watersheds in digital spaces: an efficient algorithm based on immersion simulations[J]. IEEE transactions on pattern analysis and machine intelligence, 1991, 13(6): 583-598.
[2] http://blog.sciencenet.cn/blog-733228-578509.html