Image processing 如何在标签矩阵中绘制对象的轮廓

Image processing 如何在标签矩阵中绘制对象的轮廓,image-processing,matlab,contour,image-segmentation,Image Processing,Matlab,Contour,Image Segmentation,我有一个分割图像的标签矩阵。 比如说, 1234 1 1 2 2 3 3 4 4 1 1 2 2 3 3 4 4 1 1 2 2 3 3 4 4 1 1 2 2 3 3 4 4 1 1 2 2 3 3 4 4 1 1 2 2 3 3 4 4 1 1 2 2 3 3 4 4 现在我想画每个物体的轮廓,这样每个物体边缘的像素值是1,其他像素值是0 像这样的 1 10110110101101 10110110101101 10110110101101 10110110101101 1011011010

我有一个分割图像的标签矩阵。 比如说,


1234
1 1 2 2 3 3 4 4
1 1 2 2 3 3 4 4
1 1 2 2 3 3 4 4
1 1 2 2 3 3 4 4
1 1 2 2 3 3 4 4
1 1 2 2 3 3 4 4
1 1 2 2 3 3 4 4

现在我想画每个物体的轮廓,这样每个物体边缘的像素值是1,其他像素值是0

像这样的


1
10110110101101
10110110101101
10110110101101
10110110101101
10110110101101
10110110101101
11


我希望有一个函数可以在Matlab中实现这一点,但我不知道。

我一时记不起Matlab的语法,但我建议使用一个函数的算法,确定从x-1,y-1到x+1,y+1的最大值,并减去相同范围的最小值。如果是0,则需要0输出,否则为1


您可能需要稍微调整图像的边缘,可能需要使用任何代码获取每个像素的值,对于超出范围的坐标返回-1,或者类似的东西。

A
作为您的矩阵,我想这就是您要寻找的:

(conv2(A,[1 -2 1],'same') ~=0)|(conv2(A,[1; -2; 1],'same') ~=0)
下面是您的示例的结果:

 1     1     1     1     1     1     1     1     1     1     1     1
 1     0     1     1     0     1     1     0     1     1     0     1
 1     0     1     1     0     1     1     0     1     1     0     1
 1     0     1     1     0     1     1     0     1     1     0     1
 1     0     1     1     0     1     1     0     1     1     0     1
 1     0     1     1     0     1     1     0     1     1     0     1
 1     0     1     1     0     1     1     0     1     1     0     1
 1     1     1     1     1     1     1     1     1     1     1     1
答案是允许您使用co 4连接标签,只要图像中的对象在任何地方都至少有三个像素宽,就可以工作

如果您的周长需要8-连接,或者如果您的对象可能很窄,您应该研究重复应用(再次假设
A
是您的图像):

conn = 8; %# select connectedness
nLbl = max(A(:)); %# note this works even if some labels are missing

out = false(size(A)); %# preassign the output

for lbl = 1:nLbl
    %# get the perimeter for each object
    out = out | bwperim(A==lbl,connn);
end