我想知道是否有一种简单的方法可以将标签矩阵转换为矩阵,其中有两个标记区域在任何地方相交并且其他地方为零,这样您就可以基本上在原始图像上叠加区域的边界,标签是生成为流行的label2rgb函数的另一个可视化替代。
我问的原因是我正在研究一些超像素代码,所以我有很多标记区域(500到5,000)。我一直在使用rgblabel将超像素标签转换为彩色区域,转向保持,然后将其显示在原始图像上,并将“AlphaData”调低以使其半透明。然而,由于区域太多,这在视觉上难以分析,我认为区域的简单边界会更好。感谢。
[编辑] @O_O:我已经附上了样本标签矩阵以及目标结果,尽管我现在对Jonas的第二个建议非常满意。将在第二天尝试来自user616736的方法。我还有uploaded .mat格式的示例图片,以防其他人想要试验它们。
标签矩阵:
期望的结果:
答案 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的股票图像,因此您可以在您的计算机上运行此代码。图像看起来像这样。
现在获取labelmatrix
bw = im2bw(img, graythresh(img));
cc = bwconncomp(bw);
lblMatrix = labelmatrix(cc);
imshow(lblMatrix)
lblMatrix
看起来像这样
现在我们得到标签矩阵的边缘。这里我使用了拉普拉斯高斯方法,但您可以选择任何其他算法(请参阅帮助以获取更多信息)
edgeMatrix=edges(lblMatrix,'log',0);
imshow(edgeMatrix)
这会找到大于0
的所有边,这正是您所需要的。然后,您可以在处理过程中操纵它,并在其他数字之上叠加。在实践中,你需要一些略高于零的东西,这样你就不会得到那些小圆圈(这只是因为噪音),而只能恢复你想要的东西。您可以修改并将阈值调整为其他内容,直到您做到恰到好处。虽然这可以自动化,但在不知道实际问题的情况下我不能说太多。无论如何,这只是为了让你开始朝着正确的方向前进。
答案 2 :(得分:1)