Jong-Bae Kim, Hang-Joon Kim在其文章“Multiresolution-based watersheds for efficientLUPA开源社区+ej p-w(v)D^)\7s
image segmentation”中将分割技术分类为基于聚类的分割,基于边缘检测的分割及基于区域提取的分割技术。并且简单的总结了各自的优缺点等,这里不做赘述。
分水岭变换本质上是一种区域增长的分割方法,但它得到的是连续、闭合的区域边界,并且具有诸如运算速度快等结合了基于边界和区域性质的优点而得到广泛重视和应用。然而由于其对噪声和细密纹理的敏感而会产生严重的过分割现象。针对这个问题,很多学者提出了改进措施,诸如HIEU T,MARCEL M,REIN V等的watersnake算法,MEYER F,VACHIER C等提得基于地貌修正的算法,还有HARRIS K等提出的分割后合并的策略。虽然每一种改进措施都尤其改进的地方,但同时也有其各自面临的新的问题,这里也不多讲。
我们知道,对原始图像进行分水岭变换总是会产生严重的过分割结果,为了突出外轮廓信息,通常先求原始图像的梯度图像,然后对梯度图像进行分水岭变换。至于梯度图像我们也有多种求法,比如可以通过梯度算子求取梯度图像,matlab代码可以表示为:
hv=fspecial('sobel');%‘sobel’can be other methods,such as 'preiwitt','roberts','canny'etcLUPA开源社区 C u%~)aY
hh=hv.';
[$~
uQ#^P:[0 gv=abs(imfilter(f,hv,'replicate')); %f is the image matrix
gh=abs(imfilter(f,hh,'replicate'));LUPA开源社区m:e-VQT7Nl2fG
g=sqrt(gv.^2+gh.^2);
也可以通过形态学方法来求取其梯度图像,形态学梯度图像定义为:g(x,y)=f(x,y) b(x,y)-f(x,y) b(x,y) 。(第一个为膨胀运算,第二个为腐蚀运算,,好像这两符号看不到哎^&^),b(x,y)为结构元素。所以得先创建结构元素。当然这些在matlab中是很easy的事情,
SE = strel('disk',4);%当然其大小及形状一般需要根据目标对象的形状及半径,噪声等确定LUPA开源社区S"K.S5h5d`_
g = imsubtract(imdilate(f,SE),imerode(f,SE))
这样就求得了一幅图像的形态学梯度。
接下来我想做的一件事情是对梯度图进行开闭重建滤波。因为不管对于通过梯度算子还是形态学方法求得的梯度图像,仍然存在噪声和图像细节,所以对其进行分割依然会产生过分割现象。而开闭重建滤波的目的就在于消除梯度图像中由于灰度非规则扰动和噪声引起的局部极值,保留重要的轮廓信息。传统的开运算是先腐蚀后膨胀,而形态学开重建运算则是先做开运算,后进行重建运算。闭重建运算也类似。重建运算在形态学中定义为一个迭代的膨胀(开重建)或腐蚀(闭重建)的过程。相比开闭滤波只能消除图像中的部分高灰度和低灰度细节,开闭重建再对图像进行开闭运算的基础上增加了重建过程,而重建过程可恢复图像中那些没有完全被开闭运算所滤除的成分的边界。显然,再开闭重建滤波器的滤波过程中,细密纹理同噪声一起被开闭运算剔除,而物体轮廓却在重建过程中得以恢复,使图像在简化的同时保持主要对象的形状信息。在IPT中有一个快速计算重构的函数,imreconstruct,它使用的是在Vincent[1993]中描述的‘快速混合重构’算法。调用格式为
out = imreconstruct(marker,mask)
整个开闭重建的过程可以这样来完成:
%开重建LUPA开源社区_fx@NG;[ gu
mask= adapthisteq(g);LUPA开源社区Bt6jB/R8qr#X
marker = imerode(mask,SE);LUPA开源社区:K)L'Cz|
forec = imreconstruct(marker,mask);LUPA开源社区7N;F'M8S,n?*[
%闭重建LUPA开源社区\g+Im"Cr:?bJPP
fdilate = imdilate(forec,SE);LUPA开源社区6kW${/K7@3y_ X
y}1u
fcrec = imreconstruct(forec,fdilate)
重建过程完成之后,就可以对重建后的梯度图像进行分水岭变换了。通过采用基于标记的分水岭技术可以实现更好的分割效果,不需要再进行后续的合并处理就能够得到较为理想的结果。两张实验图像结果如图所示:其分割区域数分别为20和22.
补充内容(5-10):关于基于标记的分水岭分割
刚刚写好的东东,发布的时候却让我重新登陆,然后什么都没了.......,很委屈,还是再写一遍吧 。
在进行标记时主要分两步来实现,即前景标记(内部标记)和背景标记(外部标记)。先说前景标记,在进行前景标记时我们采用标记出目标对象的局部极大值,以得到更好的前景目标。在matlab中可以通过imregionalmax()得到局部极大值区域。但在这里,我们通过imextendedmax()来实现,需要人为设定一个标记阈值。关于这个阈值的设定,还是一个问题,有待进一步探讨,如果能够实现自动阈值就会更好。标记之后可以将目标叠加到原图上看看效果。至于背景标记,先将开闭重建之后的梯度图像转化外二值图像,再通过距离变换即可实现外部约束。标记完前景背景之后,再通过强制最小值技术对梯度图像进行重构,在重构后的梯度图像上进行分水岭变换即实现了整个分割过程。
PICer2008428931
PICer2008428932