分水岭算法的概念及原理

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

分水岭算法

Watershed Algorithm(分水岭算法),顾名思义,就是根据分水岭的构成来考虑图像的分割。现实中人们可以或者说可以想象有山有湖的景象,那么那一定是水绕山,山围水的情形。当然在需要的时候,要人工构筑分水岭,以防集水盆之间的互相穿透。而区分高山(plateaus)与水的界线,以及湖与湖之间的间隔或都是连通的关系,就是分水岭(watershed)。为了得到一个相对集中的集水盆,那么让水涨到接近周围最高的山顶就可以了,这样的话,我们就可以用来获取边界灰阶大,中间灰阶小的物体区域了,它就是集水盆。

分水岭算法的概念及原理

分水岭分割方法,是一种基于拓扑理论的数学形态学的分割方法,其基本思想是把图像看作是测地学上的拓扑地貌,图像中每一点像素的灰度值表示该点的海拔高度,每一个局部极小值及其影响区域称为集水盆,而集水盆的边界则形成分水岭。分水岭的概念和形成可以通过模拟浸入过程来说明。在每一个局部极小值表面,刺穿一个小孔,然后把整个模型慢慢浸入水中,随着浸入的加深,每一个局部极小值的影响域慢慢向外扩展,在两个集水盆汇合处构筑大坝,即形成分水岭。

分水岭的计算过程是一个迭代标注过程。分水岭比较经典的计算方法是L. Vincent提出的。在该算法中,分水岭计算分两个步骤,一个是排序过程,一个是淹没过程。首先对每个像素的灰度级进行从低到高排序,然后在从低到高实现淹没过程中,对每一个局部极小值在h阶高度的影响域采用先进先出(FIFO)结构进行判断及标注。

分水岭变换得到的是输入图像的集水盆图像,集水盆之间的边界点,即为分水岭。显然,分水岭表示的是输入图像极大值点。因此,为得到图像的边缘信息,通常把梯度图像作为输入图像,即

g(x,y)=grad(f(x,y))={[f(x,y)-f(x-1,y)]2[f(x,y)-f(x,y-1)]2}0.5

式中,f(x,y)表示原始图像,grad{.}表示梯度运算。

分水岭算法对微弱边缘具有良好的响应,图像中的噪声、物体表面细微的灰度变化,都会产生过度分割的现象。但同时应当看出,分水岭算法对微弱边缘具有良好的响应,可得到封闭连续的边缘。通过分水岭算法所得到的封闭的集水盆,为分析图像的区域特征提供了可能。

分水岭算法有时会产生过度分割,为了避免产生这种过度分割,通常可以采用两种处理方法,一是利用先验知识删除无关边缘信息。二是可以修改梯度函数,使得集水盆只响应所探测的目标。

对于通过梯度函数降低低分水岭算法的过度分割,需要对梯度函数进行改进,一个简单的改进方法是对梯度图像进行阈值处理,从而消除像素灰度值的微小变化引起过度分割。即:

g(x,y)=max(grad(f(x,y)),gθ)

式中,gθ表示阈值。

程序可采用方法:用阈值限制梯度图像以达到消除灰度值的微小变化产生的过度分割,获得适量的区域,再对这些区域的边缘点的灰度级进行从低到高排序,然后在从低到高实现淹没的过程,梯度图可由Sobel算子计算得到。对梯度图像进行阈值处理时,阈值的合理选择对分割结果有较大的影响,因此,阈值的选取是影响图像分割效果的一个关键。该方法的缺点是,通常一些实际图像可能含有微弱的边缘,灰度值变化不是特别明显,阈值选取过大可能会消除这些微弱边缘。

分水岭算法是数学形态学分割方法中的经典算法,它将图像看作是地形学上被水覆盖的自然地貌,图像中的每一像素的灰度值表示该点的海拔高度,其每一个局部极小值及其影响区域称为集水盆,集水盆的边界则是分水岭,在各极小区域的表面打一个小孔,同时让水从小孔中涌出,并慢慢淹没极小区域周围的区域,那么各极小区域波及的范围,即是相应的集水盆,对应图像中的区域;不同区域的水流相遇时的界限,就是期望得到的分水岭,对应区域的边缘。分水岭变换可以保证分割区域的连续性和封闭性。

分水岭变换是从局部极小点开始,即只能是在梯度图中用,原始图是转换后才能用于分水岭变换的。一般图像中存在多个极小值点,通常会存在过分割现象,可以采用梯度阈值分割改进或者采用标记分水岭算法将多个极小值区域连在一起。

如果图像中的目标物体是连在一起的,则分割起来会更困难,分水岭算法经常用于处理这类问题,通常会取得比较好的效果。分水岭分割算法把图像看成一副“地形图”,其中亮度比较强的地区像素值较大,而比较暗的地区像素比较小,通过寻找“汇水盆地”和“分水岭界限”,对图像进行分割。

步骤:

1.读取图像

2.求取图像的边界,在此基础上可直接应用分水岭分割算法,但效果不佳;

3.对图像的前景和背景进行标记,其中每个对象内部的前景像素都是相连的,背景里面的每个像素值都不属于任何目标物体;

4.计算分割函数,应用分水岭分割算法的实现

注:直接用分水岭分割算法效果并不好,如果在图像中对前景和背景进行标注区别,再应用分水岭算法会取得较好的分割效果。

例步骤:

1.读取图像并求取图像的边界。

rgb = imread('pears.png');%读取原图像

I = rgb2gray(rgb);%转化为灰度图像

figure; subplot(121)%显示灰度图像

imshow(I)

text(732,501,'Image courtesy of Corel',...

'FontSize',7,'HorizontalAlignment','right')

hy = fspecial('sobel');%sobel算子

hx = hy';

Iy = imfilter(double(I), hy, 'replicate');%滤波求y方向边缘

Ix = imfilter(double(I), hx, 'replicate');%滤波求x方向边缘

gradmag = sqrt(Ix.^2 + Iy.^2);%求摸

subplot(122); imshow(gradmag,[]), %显示梯度

title('Gradient magnitude (gradmag)')

2. 直接使用梯度模值进行分水岭算法:(往往会存在过的分割的情况,效果不好)

L = watershed(gradmag);%直接应用分水岭算法

Lrgb = label2rgb(L);%转化为彩色图像

figure; imshow(Lrgb), %显示分割后的图像

title('Watershed transform of gradient magnitude (Lrgb)')

3.分别对前景和背景进行标记:本例中使用形态学重建技术对前景对象进行标记,首先

使用开操作,开操作之后可以去掉一些很小的目标。

se = strel('disk', 20);%圆形结构元素

Io = imopen(I, se);%形态学开操作

figure; subplot(121)

imshow(Io), %显示执行开操作后的图像

title('Opening (Io)')

Ie = imerode(I, se);%对图像进行腐蚀

Iobr = imreconstruct(Ie, I);%形态学重建

subplot(122); imshow(Iobr), %显示重建后的图像

title('Opening-by-reconstruction (Iobr)')

Ioc = imclose(Io, se);%形态学关操作

figure; subplot(121)

imshow(Ioc), %显示关操作后的图像

title('Opening-closing (Ioc)')

Iobrd = imdilate(Iobr, se);%对图像进行膨胀

Iobrcbr = imreconstruct(imcomplement(Iobrd), ...

imcomplement(Iobr));%形态学重建

Iobrcbr = imcomplement(Iobrcbr);%图像求反

subplot(122); imshow(Iobrcbr), %显示重建求反后的图像

title('Opening-closing by reconstruction (Iobrcbr)')

fgm = imregionalmax(Iobrcbr);%局部极大值

相关文档
最新文档