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

时间:2011-10-10 10:53:16

标签: image-processing matlab contour image-segmentation

我有一个分段图像的标签矩阵。 例如,


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

现在我想绘制每个对象的轮廓,使每个对象边缘的像素值为1,其他像素值为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

我希望有一个函数可以在Matlab中完成,但我不知道。

3 个答案:

答案 0 :(得分:2)

@Laurent'的答案允许您进行4连接标记,只要图像中的对象至少有三个像素宽,就可以正常工作。

如果您的周边需要8个连接,或者您的对象可能很窄,那么您应该重复应用BWPERIM(假设A是您的图像):< / p>

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

答案 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

答案 2 :(得分:0)

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

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