标记控制的分水岭分割
这个例子展示了如何使用分水岭分割来分离图像中的触摸对象。分水岭变换通过将图像视为一个表面,其中浅色像素高,深色像素低,从而在图像中发现“流域”和“分水岭山脊线”。
如果您能够识别或“标记”前景对象和背景位置,那么使用分水岭变换的分割效果会更好。标记控制的分水岭分割遵循以下基本程序:
计算一个分割函数。这是一张图像,其暗区域是您试图分割的对象。
计算前景标记。这些是每个对象内连接的像素点。
计算背景标记。这些像素不是任何物体的一部分。
修改分割功能,使其仅在前景和背景标记位置有最小值。
计算修改后的分割函数的分水岭变换。
步骤1:读取彩色图像并将其转换为灰度
RGB = imread(“pears.png”);I = rgb2gray(rgb);imshow (I)文本(732501图片由Corel(R)提供,...“字形大小”7“HorizontalAlignment”,“对”)
步骤2:使用梯度幅度作为分割函数
计算梯度幅值。渐变在对象的边界处高,在对象内部(大多数情况下)低。
gmag = imgradient(I);imshow (gmag[])标题(“梯度大小”)
你能直接在梯度幅值上使用分水岭变换分割图像吗?
L =分水岭(gmag);Lrgb = label2rgb(L);imshow (Lrgb)标题(“梯度幅值的分水岭变换”)
不。如果没有额外的预处理,例如下面的标记计算,直接使用分水岭变换通常会导致“过度分割”。
步骤3:标记前景对象
这里可以应用各种程序来寻找前景标记,这些标记必须是每个前景对象内部连接的像素团。在本例中,您将使用称为“通过重建打开”和“通过重建关闭”的形态学技术来“清理”图像。这些操作将在每个对象中创建平面最大值,可以使用imregionalmax
.
开放是一种侵蚀后的扩张,而开放-重建是一种侵蚀后的形态重建。让我们比较一下这两者。首先,用计算开口imopen
.
Se = strel(“磁盘”, 20);Io = imopen(I,se);imshow (Io)标题(“打开”)
接下来,使用imerode
而且imreconstruct
.
Ie = imerosion (I,se);Iobr = imrebuild(即,I);imshow (Iobr)标题(“Opening-by-Reconstruction”)
打开后再关闭可以去除黑斑和茎痕。比较常规形态闭包和重建闭包。第一次尝试imclose
:
Ioc = imclose(Io,se);imshow (Ioc)标题(“开合”)
现在使用imdilate
紧随其后的是imreconstruct
.注意,您必须补充图像的输入和输出imreconstruct
.
Iobrd = imdilate(Iobr,se);Iobrcbr = imrebuild (imcomplement(Iobrd),imcomplement(Iobr));Iobrcbr = imcomplement(Iobrcbr);imshow (Iobrcbr)标题(“由重建开始-结束”)
通过比较你可以看到Iobrcbr
与国际奥委会
,在不影响物体整体形状的情况下,基于重建的开合比标准开合更有效地去除小瑕疵。的区域极大值Iobrcbr
以获得良好的前景标记。
fgm = imregionalmax(Iobrcbr);imshow(女性生殖器切割)标题(“开放-重建的区域极限”)
为了帮助解释结果,将前景标记图像叠加在原始图像上。
I2 = labeloverlay(I,fgm);imshow (I2)标题(“原始图像叠加的区域极大值”)
请注意,一些主要遮挡和阴影对象没有标记,这意味着这些对象在最终结果中不会被正确分割。此外,某些对象中的前景标记会直接上升到对象的边缘。这意味着你应该清理标记斑点的边缘,然后缩小一点。你可以通过关闭和侵蚀来做到这一点。
Se2 = strel(ones(5,5));Fgm2 = imclose(fgm,se2);Fgm3 = imerosion (fgm2,se2);
这个过程往往会留下一些必须删除的零散孤立像素。你可以用bwareaopen
,它会删除所有像素小于一定数量的斑点。
Fgm4 = bwareaopen(fgm3,20);I3 = labeloverlay(I,fgm4);imshow (I3)标题(“在原始图像上叠加的修正区域极大值”)
步骤4:计算背景标记
现在你需要标记背景。在清理后的图像中,Iobrcbr
,深色像素属于背景,因此可以从阈值操作开始。
bw = imbinalize (Iobrcbr);imshow (bw)标题(“重建的阈值开放-关闭”)
背景像素是黑色的,但理想情况下,我们不希望背景标记太接近我们试图分割的对象的边缘。我们将通过计算前景的“影响区骨架”(SKIZ)来“瘦化”背景bw
.这可以通过计算距离变换的分水岭变换来实现bw
,然后寻找分水岭脊线(Dl == 0
)的结果。
D = bwdist(bw);DL =分水岭(D);bgm = DL == 0;imshow (bgm)标题(“分水岭山脊线”)
步骤5:计算分割函数的分水岭变换。
这个函数imimposemin
可用于修改图像,使其仅在某些所需位置具有区域最小值。这里你可以使用imimposemin
修改梯度幅值图像,使其唯一的区域最小值出现在前景和背景标记像素处。
Gmag2 = imimposemin(gmag, BGM | fgm4);
最后,计算基于分水岭的分割。
L =分水岭(gmag2);
第六步:可视化结果
一种可视化技术是在原始图像上叠加前景标记、背景标记和分割的对象边界。您可以根据需要使用膨胀来使某些方面(如对象边界)更明显。对象边界位于此处L == 0
.二进制前景和背景标记被缩放为不同的整数值,以便它们被分配不同的标签。
标签= imdilate(L==0,ones(3,3)) + 2*bgm + 3*fgm4;I4 = labeloverlay(I,labels);imshow(预告)标题(“标记和物体边界叠加在原始图像上”)
这个可视化说明了前景和背景标记的位置如何影响结果。在一些位置,部分被遮挡的较暗的物体与较亮的相邻物体合并,因为被遮挡的物体没有前景标记。
另一个有用的可视化技术是将标签矩阵显示为彩色图像。标记矩阵,例如由分水岭
而且bwlabel
,可转换为真彩色图像,以供可视化使用label2rgb
.
Lrgb = label2rgb(L,“喷气机”,' w ',“洗牌”);imshow (Lrgb)标题(“彩色分水岭标签矩阵”)
您可以使用透明度来将这个伪颜色标签矩阵叠加到原始强度图像的顶部。
figure imshow(I) hold住在himage = imshow(Lrgb);himage。AlphaData = 0.3;标题(“彩色标签透明地叠加在原始图像上”)
另请参阅
分水岭
|imopen
|imreconstruct
|imclose
|imdilate
|imregionalmax
|imerode
|bwareaopen
|bwdist
|label2rgb
|imcomplement
|labeloverlay
|imgradient