这个例子展示了如何使用分水岭分割来分离图像中的触摸对象。分水岭变换通过将图像处理为亮像素高而暗像素低的表面,从而在图像中找到“流域流域”和“流域脊线”。
如果你能识别或“标记”前景物体和背景位置,那么使用分水岭变换进行分割效果会更好。标记控制分水岭分割遵循以下基本步骤:
计算一个分割函数。这是一个图像,它的黑暗区域是你试图分割的对象。
计算前景标记。这些是每个对象内连接的像素点。
计算背景标记。这些像素不是任何对象的一部分。
修改分割函数,使它只在前景和背景标记位置有最小值。
计算改进后的分割函数的分水岭变换。
rgb = imread (“pears.png”);I = rgb2gray (rgb);imshow (I)文本(732501“图片由Corel提供(R)”,...“字形大小”7“HorizontalAlignment”,“对”)
计算梯度大小。渐变在对象的边缘是高的,在对象内部是低的(大部分)。
gmag = imgradient(我);imshow (gmag[])标题(“梯度大小”)
你能直接在梯度大小上使用分水岭变换分割图像吗?
L =分水岭(gmag);Lrgb = label2rgb (L);imshow (Lrgb)标题(“梯度量级的分水岭变换”)
不。如果没有额外的预处理,如下面的标记计算,直接使用分水岭变换通常会导致“过度分割”。
在这里可以应用各种程序来寻找前景标记,这些标记必须连接每个前景对象内部的像素块。在这个例子中,您将使用形态学技术,称为“通过重建打开”和“通过重建关闭”来“清理”图像。这些操作将在每个可以定位的对象内部创建平坦的maximaimregionalmax
.
开放是侵蚀后的扩张,而开放重建是侵蚀后的形态重建。让我们来比较一下这两者。首先,计算开口使用imopen
.
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)标题(“开合”)
现在使用imdilate
紧随其后的是imreconstruct
.注意您必须补充的图像输入和输出imreconstruct
.
Iobrd = imdilate (Iobr, se);Iobrcbr = imreconstruct (imcomplement (Iobrd) imcomplement (Iobr));Iobrcbr = imcomplement (Iobrcbr);imshow (Iobrcbr)标题(“开合的重建”)
你可以通过比较看到Iobrcbr
与国际奥委会
,基于重构的开合比标准的开合更有效,在不影响物体整体形状的情况下去除小瑕疵。计算的区域最大值Iobrcbr
以获得良好的前景标记。
女性生殖器切割= imregionalmax (Iobrcbr);imshow(女性生殖器切割)标题(“通过重建实现开放与关闭的区域最大化”)
为了帮助解释结果,将前景标记图像叠加到原始图像上。
I2 = labeloverlay(我、女性生殖器切割);imshow (I2)标题(“原始图像上的区域最大值叠加”)
注意,一些大部分被遮挡和阴影的物体没有被标记,这意味着这些物体在最终结果中不会被正确分割。同样,一些物体的前景标记会一直延伸到物体的边缘。这意味着你应该清理标记斑点的边缘,然后把它们缩小一点。你可以先结束,然后进行侵蚀。
se2 = strel(的(5,5));fgm2 = imclose(女性生殖器切割,se2);fgm3 = imerode (fgm2 se2);
这个过程往往会留下一些必须删除的零散的孤立像素。你可以用bwareaopen
,它删除所有像素小于一定数量的斑点。
fgm4 = bwareaopen (fgm3 20);I3 = labeloverlay(我fgm4);imshow (I3)标题(“在原始图像上叠加修改的区域最大值”)
现在你需要标记背景。在清理后的图像中,Iobrcbr
,暗像素属于背景,所以可以从阈值操作开始。
bw = imbinarize (Iobrcbr);imshow (bw)标题(“通过重建开启-关闭门槛”)
背景像素是黑色的,但理想情况下,我们不希望背景标记太接近我们试图分割的对象的边缘。我们将通过计算前景的“影响区域骨架”或SKIZ来“瘦化”背景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
,可转换为真彩色图像的可视化目的使用label2rgb
.
Lrgb = label2rgb (L,“喷气机”,' w ',“洗牌”);imshow (Lrgb)标题(“彩色分水岭标签矩阵”)
您可以使用透明度将这个伪颜色标签矩阵叠加到原始强度图像的顶部。
图imshow(我)在himage = imshow (Lrgb);himage。AlphaData = 0.3;标题(“彩色标签透明地叠加在原始图像上”)
分水岭
|imopen
|imreconstruct
|imclose
|imdilate
|imregionalmax
|imerode
|bwareaopen
|bwdist
|label2rgb
|imcomplement
|labeloverlay
|imgradient