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

时间:2011-03-10 20:59:02

标签: matlab image-processing label

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

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

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

标签矩阵:

Label Matrix

期望的结果:

Desired Result

3 个答案:

答案 0 :(得分: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))

答案 1 :(得分:5)

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

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

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

enter image description here

现在获取labelmatrix

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

答案 2 :(得分:1)

快速跟进:

我还在Steve Eddins的blog上提出了这个问题,他offered可以快速找到标签图像的边缘:

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

我喜欢这个选项,因为我寻找边框的主要原因是出于可视化目的,这会给边框增加一些厚度。此外,他的函数imoverlay是一种方便的方法,可以查看您在生成标签的原始图像上找到的边框。