2

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


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 1

我希望有一个函数可以在 Matlab 中执行此操作,但我不知道。

4

3 回答 3

2

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

如果您的周长需要 8 连接,或者您的对象可能很窄,您应该研究BWPERIM的重复应用(再次假设这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
于 2011-10-10T12:55:06.673 回答
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
于 2011-10-10T11:51:18.890 回答
0

我不记得matlab的语法了,但我建议一个算法沿着函数的线确定从x-1,y-1到x + 1,y + 1的最大值,并减去最小值相同的范围。如果那是 0,那么你想要一个 0 输出,否则为 1。

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

于 2011-10-10T10:56:29.753 回答