这个例子展示了如何使用分水岭分割来分离图像中的触摸对象。分水岭变换通过将图像处理为亮像素高而暗像素低的表面,从而在图像中找到“流域流域”和“流域脊线”。
如果您可以识别或“标记”的前景对象和背景位置,使用流域变换的分割工作更好。标记控制的流域分割遵循此基本程序:
计算一个分割函数。这是一个图像,它的黑暗区域是你试图分割的对象。
计算前景标记。这些是在每个对象中连接的像素的斑点。
计算背景标记。这些像素不是任何对象的一部分。
修改分段函数,使其在前台和背景标记位置仅具有最小值。
计算改进后的分割函数的分水岭变换。
rgb = imread ('pears.png');i = RGB2GRAY(RGB);imshow(i)文字(732,501,'图片由Corel(R)'提供那......“字形大小”7,'水平对齐'那'对')
计算梯度幅度。梯度高于物体边界,并且在物体内部低(主要)。
gmag = imgradient(我);imshow (gmag[])标题(“梯度大小”)
您可以通过直接在梯度幅度上使用流域变换来分割图像吗?
l =流域(Gmag);lrgb = label2RGB(L);imshow(lrgb)标题('流域的梯度幅度转换')
不。如果没有额外的预处理,如下面的标记计算,直接使用分水岭变换通常会导致“过度分割”。
在这里可以应用各种程序来寻找前景标记,这些标记必须连接每个前景对象内部的像素块。在这个例子中,您将使用形态学技术,称为“通过重建打开”和“通过重建关闭”来“清理”图像。这些操作将在每个可以定位的对象内部创建平坦的maximaimregionalmax.
.
开放是一种侵蚀,然后是扩张,而开放的重建是一种侵蚀,然后是形态重建。让我们比较这两者。首先,计算使用伊莫登
.
se = strel ('盘', 20);Io = imopen(我,se);imshow (Io)标题(“打开”)
接下来使用imerode
和imreconstruct
.
Ie = imerode(我,se);Iobr = imreconstruct(即我);imshow (Iobr)标题(“Opening-by-Reconstruction”)
在带有闭合的开口之后可以去除暗点和茎标记。比较常规重建的常规形态关闭。第一次尝试imclose
:
国际奥委会= imclose (Io, se);imshow (Ioc)标题('开放')
现在使用混合
紧随其后的是imreconstruct
.注意您必须补充图像输入和输出imreconstruct
.
Iobrd = imdilate (Iobr, se);Iobrcbr = imreconstruct (imcomplement (Iobrd) imcomplement (Iobr));Iobrcbr = imcomplement (Iobrcbr);imshow (Iobrcbr)标题(“通过重建开放”)
你可以通过比较来看Iobrcbr.
与IOC
,基于重建的开放和关闭比标准开口和关闭更有效,在不影响物体的整体形状的情况下拆除小瑕疵。计算区域最大值Iobrcbr.
获得良好的前景标记。
女性生殖器切割= imregionalmax (Iobrcbr);imshow(女性生殖器切割)标题(“通过重建实现开放与关闭的区域最大化”)
为了帮助解释结果,将前景标记图像叠加到原始图像上。
I2 = Labeloverlay(I,FGM);imshow(i2)标题('区域最大叠加在原始图像上')
请注意,未标记一些大多数封闭的和阴影对象,这意味着这些对象在最终结果中不会正确分割。此外,某些物体中的前景标记将达到对象的边缘。这意味着您应该清理标记斑点的边缘,然后缩小它们。你可以通过结束,然后是侵蚀来做这件事。
se2 = strel((5,5));FGM2 = Imclose(FGM,SE2);FGM3 = IMERODE(FGM2,SE2);
该过程倾向于留下必须去除的一些杂散隔离像素。你可以使用这个bwareaopen
,它删除所有像素小于一定数量的斑点。
FGM4 = Bwareaopen(FGM3,20);i3 = Labeloverlay(I,FGM4);imshow(i3)标题(“在原始图像上叠加修改的区域最大值”)
现在你需要标记背景。在清洁图像中,Iobrcbr.
,暗像素属于背景,所以可以从阈值操作开始。
bw = imbinarize(iobrcbr);imshow(bw)标题('通过重建阈值开放式关闭')
背景像素处于黑色,但理想情况下,我们不希望背景标记太靠近我们尝试段的对象的边缘。我们将通过计算“通过影响区域”,或滑雪精灵的“骨架”来“薄”背景BW.
.这可以通过计算距离变换的流域变换来完成的BW.
,然后寻找分水岭山脊线(戴斯。莱纳姆:= = 0
)结果。
d = bwdist(bw);dl =流域(d);BGM = DL == 0;imshow(bgm)标题('流域脊线')
功能imimposemin
可用于修改图像,使其仅在某些所需位置具有区域最小值。在这里,您可以使用imimposemin
修改梯度幅度图像,使其仅在前台和背景标记像素处发生其唯一的区域最小值。
gmag2 = imimposemin(gmag,bgm | fgm4);
最后,计算基于分水岭的分割。
l =流域(Gmag2);
一种可视化技术是将前景标记物、背景标记物和分割后的物体边界叠加在原始图像上。您可以根据需要使用扩展来使某些方面(如对象边界)更加可见。对象边界位于l == 0.
.二进制前景和背景标记被缩放到不同的整数,以便它们被分配不同的标签。
标签= imdilate(L==0,ones(3,3)) + 2*bgm + 3*fgm4;当= labeloverlay(我、标签);imshow(预告)标题(“标记和物体边界叠加在原始图像上”)
这个可视化演示了前景和背景标记的位置如何影响结果。在一些地方,部分被遮挡的较暗物体被与其较亮的邻居物体合并,因为被遮挡的物体没有前景标记。
另一种有用的可视化技术是以彩色图像显示标签矩阵。标签矩阵,例如由此产生的矩阵分水岭
和bwlabel
,可以通过使用来转换为TrueColor图像以进行可视化目的label2RGB.
.
LRGB = Label2RGB(L,“喷气机”那' w '那“洗牌”);imshow(lrgb)标题(“彩色分水岭标签矩阵”)
您可以使用透明度来叠加在原始强度图像顶部的伪颜色标签矩阵。
图imshow(i)持有在hemage = imshow(lrgb);hemage.alphadata = 0.3;标题(“彩色标签透明地叠加在原始图像上”)
bwareaopen
|Bwdist.
|imclose
|恰当
|混合
|imerode
|Imgradient.
|伊莫登
|imreconstruct
|imregionalmax.
|label2RGB.
|Labeloverlay.
|分水岭