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

SSi*_*ilk 8 matlab label image-processing

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

我问的原因是我目前正在研究一些超像素代码,因此我有许多标记区域(500到5,000).我一直在使用rgblabel将超像素标签转换为彩色区域,转向保持,然后将其显示在原始图像上,并将"AlphaData"调低以使其半透明.然而,由于区域太多,这在视觉上难以分析,我认为区域的简单边界会更好.谢谢.

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

标签矩阵:

标签矩阵

期望的结果:

期望的结果

Jon*_*nas 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))
Run Code Online (Sandbox Code Playgroud)

编辑

找到边框的更快方法是使用标记图像的渐变

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

imshow(label2rgb(lblImg))
Run Code Online (Sandbox Code Playgroud)


abc*_*bcd 5

如果您可以访问图像处理工具箱(我假设您这样做,因为您正在处理标签矩阵),您可以使用该edge功能.这是一个简单的例子

img = imread('rice.png');
imshow(img)
Run Code Online (Sandbox Code Playgroud)

rice.png是Matlab的股票图像,因此您可以在您的机器上运行此代码.图像看起来像这样.

在此输入图像描述

现在获得labelmatrix

bw = im2bw(img, graythresh(img)); 
cc = bwconncomp(bw);
lblMatrix = labelmatrix(cc);
imshow(lblMatrix)
Run Code Online (Sandbox Code Playgroud)

lblMatrix 看起来像这样

在此输入图像描述

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

edgeMatrix=edges(lblMatrix,'log',0);
imshow(edgeMatrix)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这会找到所有大于的边0,这就是您所需要的.然后,您可以在处理过程中操纵它,并在其他数字之上叠加.在实践中,你需要一些略高于零的东西,这样你就不会得到那些小圆圈(这只是因为噪音),而只能恢复你想要的东西.您可以修改并将阈值调整为其他内容,直到您做到恰到好处.虽然这可以自动化,但在不知道实际问题的情况下我不能说太多.无论如何,这只是为了让你开始朝着正确的方向前进.