我有一个分段图像的标签矩阵。 例如,
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中完成,但我不知道。
答案 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,或类似的东西。