在 MATLAB 中查找标签图像的轮廓/边框

问题描述 投票:0回答:4

我想知道是否有一种简单的方法可以将标签矩阵转换为矩阵,其中两个标记区域相交的任何地方都有线,其他地方有零,这样您就可以基本上将区域的边界叠加在生成标签的原始图像上,如下所示流行的 label2rgb 函数的另一种可视化替代方案。

我问的原因是我目前正在处理一些超像素代码,所以我有很多标记区域(500 到 5,000)。我一直在使用 rgblabel 将超像素标签转换为彩色区域,打开保留,然后将它们显示在原始图像上,并关闭“AlphaData”以使它们半透明。然而,由于区域如此之多,这可能很难从视觉上进行分析,我认为简单的区域边界效果会更好。谢谢。

[编辑] @O_O:我已经附上了示例标签矩阵以及目标结果,尽管我现在对乔纳斯的第二个建议非常满意。第二天也会尝试 user616736 的方法。我还在这里上传了 .mat 格式的示例图像,以防其他人想要尝试它们。

标签矩阵:

Label Matrix

期望的结果:

Desired Result

matlab image-processing label
4个回答
7
投票

一种方法是循环遍历所有标签并消除除边框之外的所有标签,如下所示(其中

lblImg
是标签矩阵)

nLabels = max(lblImg(:));
for lbl = 1:nLabels
    currenObject = lblImg == lbl; %# find pixels belonging to current label
    lblImg(imerode(currentObject,strel('disk',1))) = 0; %# mask all but the border
end

imshow(label2rgb(lblImg))

编辑

查找边界的更快方法是使用标记图像的梯度

[gx,gy] = gradient(lblImg);
lblImg((gx.^2+gy.^2)==0) = 0;

imshow(label2rgb(lblImg))

5
投票

如果您有权访问图像处理工具箱(我假设您这样做,因为您正在处理标签矩阵),则可以使用

edge
函数。这是一个简单的例子

img = imread('rice.png');
imshow(img)

rice.png
是 Matlab 的库存图像,因此您可以在您的计算机上运行此代码。图像看起来像这样。

enter image description here

现在获取标签矩阵

bw = im2bw(img, graythresh(img)); 
cc = bwconncomp(bw);
lblMatrix = labelmatrix(cc);
imshow(lblMatrix)

lblMatrix
看起来像这样

enter image description here

现在我们得到了标签矩阵的边。这里我使用了高斯拉普拉斯方法,但你可以选择任何其他算法(更多信息请参阅帮助)

edgeMatrix=edges(lblMatrix,'log',0);
imshow(edgeMatrix)

enter image description here

这会找到所有大于

0
的边,这就是您所需要的。然后,您可以在处理中按照您想要的方式操纵它,并将其叠加在其他图形之上。在实践中,您需要略高于零的值,这样您就不会得到那些小圆圈(这只是由于噪音),而只恢复您想要的。您可以修补和调整阈值到其他东西,直到您得到正确的结果。虽然这可以自动化,但在不知道实际问题的情况下我不能说太多。无论如何,这只是为了让您朝着正确的方向开始。


1
投票

快速跟进:

我还在 Steve Eddins 的博客上提出了这个问题,他提供了一种非常快速的方法来找到标签图像的边缘:

region_borders = imdilate(lblImg,ones(3,3)) > imerode(lblImg,ones(3,3));

我喜欢这个选项,因为我寻找边框的主要原因是为了可视化目的,这给出了更厚的边框。此外,他的函数

imoverlay
是查看在生成标签的原始图像顶部找到的边框的便捷方法。


0
投票

我想你现在可以使用boundarymask函数

© www.soinside.com 2019 - 2024. All rights reserved.