Matlab中的边界和轮廓

时间:2011-05-17 12:07:46

标签: matlab

我有一个二进制图像,上面有非像素宽度的非闭合曲线。我想把这条曲线作为一个点列表(按正确的顺序)。我发现bwboundaries函数试图包装所有非零像素,因此在这种情况下返回重复点:

>> A = [0 0 0; 1 1 1; 0 0 0];
>> b = bwboundaries(A)

ans = 

    [5x2 double]

>> b{1}

ans =

     2     1
     2     2
     2     3
     2     2
     2     1

bwtraceboundary做同样的事情

>> bwtraceboundary(A, [2 1], 'E')

ans =

     2     1
     2     2
     2     3
     2     2
     2     1

有没有任何标准方法来获得像[2 1; 2 2; 2 3]立即?

1 个答案:

答案 0 :(得分:3)

它产生双重条目,因为您的区域只有一个像素宽。我认为没有一种标准方法可以直接处理您的特殊问题。但是,您只需使用unique()函数来消除结果的双重条目。

要保持点的原始顺序,只需执行:

b = bwboundaries(A);
[dummy, ind] = unique(b{1}, 'rows', 'first');
contour = b{1}(sort(ind), :);