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