主要内容

标记控制的分水岭分割

这个例子展示了如何使用分水岭分割来分离图像中的触摸对象。分水岭变换通过将图像处理为光像素高、暗像素低的表面,在图像中发现“集水盆地”和“分水岭山脊线”。

如果您可以识别或“标记”前景对象和背景位置,那么使用分水岭变换的分割效果会更好。标记控制的分水岭分割遵循以下基本程序:

  1. 计算一个分段函数。这是一个图像的黑暗区域是你试图分割的对象。

  2. 计算前景标记。这些是在每个对象内连接的像素团。

  3. 计算背景标记。这些像素不是任何对象的一部分。

  4. 修改分割函数,使其只在前景和背景标记位置有最小值。

  5. 计算修正分割函数的分水岭变换。

步骤1:读取彩色图像并将其转换为灰度

RGB = imread(“pears.png”);I = rgb2gray(rgb);imshow (I)文本(732501“图片由Corel(R)提供”...“字形大小”7“HorizontalAlignment”“对”

图中包含一个axes对象。坐标轴对象包含图像、文本类型的两个对象。

步骤2:使用梯度幅度作为分割函数

计算梯度幅值。渐变在对象的边界处是高的,在对象内部是低的。

gmag = imgradient(I);imshow (gmag[])标题(“梯度大小”

图中包含一个axes对象。标题为Gradient amplitude的axes对象包含一个类型为image的对象。

你能直接在梯度幅值上使用分水岭变换来分割图像吗?

L =分水岭(gmag);Lrgb = label2rgb(L);imshow (Lrgb)标题(“梯度幅值的分水岭变换”

图中包含一个axes对象。标题为梯度幅值分水岭变换的轴对象包含一个类型为图像的对象。

不。没有额外的预处理,如下面的标记计算,直接使用分水岭变换通常会导致“过度分割”。

步骤3:标记前景对象

这里可以应用各种程序来查找前景标记,这些标记必须是连接在每个前景对象内部的像素团。在本例中,您将使用称为“按重建打开”和“按重建关闭”的形态学技术来“清理”图像。这些操作将在每个对象内部创建平面极大值,可以使用imregionalmax

开口是先侵蚀再扩张,而开口-重建是先侵蚀再形态重建。让我们来比较一下这两者。首先,用计算开口imopen

n . (n .)“磁盘”, 20);Io = imopen(I,se);imshow (Io)标题(“打开”

图中包含一个axes对象。标题为Opening的axes对象包含一个类型为image的对象。

接下来计算由重构打开使用imerode而且imreconstruct

Ie = imerosion (I,se);Iobr = imreconstruction(即,I);imshow (Iobr)标题(“Opening-by-Reconstruction”

图中包含一个axes对象。标题为Opening-by-Reconstruction的axes对象包含一个类型为image的对象。

打开后再关闭可以去除黑斑和茎痕。比较常规形态闭合与重构闭合。第一次尝试imclose

Ioc = imclose(Io,se);imshow (Ioc)标题(“开合”

图中包含一个axes对象。标题为“打开-关闭”的axes对象包含一个类型为image的对象。

现在使用imdilate紧随其后的是imreconstruct.注意您必须补充图像的输入和输出imreconstruct

Iobrd = imdilate(Iobr,se);Iobrcbr = imrebuild (imcomplement(Iobrd),imcomplement(Iobr));Iobrcbr = imcomplement(Iobrcbr);imshow (Iobrcbr)标题(“重建开合”

图中包含一个axes对象。标题为Opening-Closing by Reconstruction的axes对象包含一个类型为image的对象。

你可以通过比较看到Iobrcbr国际奥委会在去除小瑕疵时,基于重建的开合比标准的开合更有效,而不会影响物体的整体形状。的区域极大值Iobrcbr获得良好的前景标记。

fgm = imregionalmax(Iobrcbr);imshow(女性生殖器切割)标题(“开放-闭合重构的区域极大值”

图中包含一个axes对象。标题为“region Maxima of opening - close by Reconstruction”的axis对象包含一个类型为image的对象。

为了帮助解释结果,将前景标记图像叠加在原始图像上。

I2 = labeloverlay(I,fgm);imshow (I2)标题(“原始图像叠加的区域极大值”

图中包含一个axes对象。标题为“区域极大值叠加在原始图像上”的axis对象包含一个类型为Image的对象。

注意,一些遮挡和阴影最严重的对象没有被标记,这意味着这些对象在最终结果中不会被正确分割。此外,在一些对象的前景标记直接到对象的边缘。这意味着你应该清理标记斑点的边缘,然后缩小他们一点。你可以通过关闭和侵蚀来做到这一点。

Se2 = strel(ones(5,5));Fgm2 = imclose(fgm,se2);Fgm3 = imerosion (fgm2,se2);

这个过程往往会留下一些游离的孤立像素,必须删除。你可以使用bwareaopen,它会删除所有小于一定像素数的斑点。

Fgm4 = bwareaopen(fgm3,20);I3 = labeloverlay(I,fgm4);imshow (I3)标题(“在原始图像上叠加修正的区域极大值”

图中包含一个axes对象。标题为“修饰区域极大值叠加在原始图像上”的axis对象包含一个类型为Image的对象。

步骤4:计算背景标记

现在你需要标记背景。在清理后的图像中,Iobrcbr,深色像素属于背景,所以你可以从阈值操作开始。

bw = imbinalize (Iobrcbr);imshow (bw)标题(“重构阈值启闭”

图中包含一个axes对象。标题为“重构阈值启闭”的axis对象包含一个类型为image的对象。

背景像素是黑色的,但理想情况下,我们不希望背景标记太接近我们试图分割的对象的边缘。我们将通过计算前景的“影响区域骨架”(SKIZ)来“弱化”背景bw.这可以通过计算距离变换的分水岭变换来实现bw,然后寻找分水岭山脊线(Dl == 0)的结果。

D = bwdist(bw);DL =分水岭(D);bgm = DL == 0;imshow (bgm)标题(“分水岭山脊线”

图中包含一个axes对象。标题为Watershed Ridge Lines的axis对象包含一个类型为image的对象。

步骤5:计算分割函数的分水岭变换。

这个函数imimposemin可用于修改图像,使其仅在某些所需位置具有区域极小值。你可以在这里使用imimposemin修改梯度幅值图像,使其仅有的区域极小值出现在前景和背景标记像素处。

Gmag2 = imimposemin(gmag, BGM | fgm4);

最后,计算基于流域的分割。

L =分水岭(gmag2);

步骤6:可视化结果

一种可视化技术是在原始图像上叠加前景标记、背景标记和分割的对象边界。您可以根据需要使用膨胀来使某些方面(如对象边界)更加可见。对象边界位于何处L == 0.二进制前景和背景标记被缩放为不同的整数值,以便给它们分配不同的标签。

label = imdilate(L==0,ones(3,3)) + 2*bgm + 3*fgm4;I4 = labeloverlay(I,labels);imshow(预告)标题(“标记和物体边界叠加在原始图像上”

图中包含一个axes对象。标题标记和对象边界叠加在原始图像上的axis对象包含一个类型为Image的对象。

这个可视化说明了前景和背景标记的位置如何影响结果。在一些位置,部分闭塞的深色物体与它们明亮的相邻物体合并,因为闭塞的物体没有前景标记。

另一种有用的可视化技术是将标签矩阵显示为彩色图像。标记矩阵,如由分水岭而且bwlabel,可转换为真彩色图像,以供可视化之用label2rgb

Lrgb = label2rgb(L,“喷气机”' w '“洗牌”);imshow (Lrgb)标题(“有色流域标签矩阵”

图中包含一个axes对象。标题为Colored Watershed Label Matrix的axis对象包含一个类型为image的对象。

您可以使用透明度将这个伪颜色标签矩阵叠加到原始强度图像之上。

figure imshow(I) holdhimage = imshow(Lrgb);himage。AlphaData = 0.3;标题(“彩色标签透明叠加在原始图像上”

图中包含一个axes对象。标题为“彩色标签透明叠加在原始图像上”的axis对象包含两个类型为Image的对象。

另请参阅

||||||||||||