如何在 Matlab 中对带有或不带有封闭边界的边进行分类?

How to classify edges with enclosed boundaries or not in Matlab?

我有以下图片(已被 EDIT 下更好的图片替换):

如果我在第一个对象(白色斑点)上使用 bwboundaries,我希望边界穿过第一个白色对象的外部

如果我在第二个对象(水平白线)上使用 bwboundaries,则边界只是一条水平线。

我希望有一种方法 bwboundaries 或其他方法可以以某种方式对这 2 个对象进行不同的分类。也就是说,可以说第一个对象的边界在同一点开始和结束,而对于第二个对象,它从左端开始到右端结束

但是,如果我仔细观察 bwboundaries 如何遍历这些对象,我注意到对于第一个对象,它遍历了一次 360 度。但是对于第二个对象,它实际上是从左图像边界开始,到右图像边界,然后返回到左图像边界。

我如何为第二个对象解决 bwboundaries 的这个问题并正确地将它们分类为不同的对象(第一个的边界应该在同一点开始和结束,第二个的边界应该开始和结束在不同点)?

编辑:

这张图片更好

所以,我想到了以下想法:对于二维对象,边界很可能具有唯一的 (x, y) 坐标。对于一维对象,大多数(如果不是全部)(x, y) 值应该出现两次。因此,对于每个边界,我们只确定 unique 值,或者更准确地说是 unique 行,并检查数量是否显着减少,例如使用比率(#unique rows)/(#all rows)。一个简单的选择是为比率设置一个或多个阈值,例如ratio > 0.95 应该是一个二维对象,因为大多数值都是唯一的,ratio < 0.55 应该是一个一维对象,因为大多数值出现了两次。

img = uint8(zeros(100));
img(10:20, 10:90) = 255;
img(80, 10:90) = 255;
imshow(img);

upperThr = 0.95;
lowerThr = 0.55;

B = bwboundaries(img);
for k = 1:numel(B)
  b = B{k};
  origLength = size(b, 1);
  b = unique(b, 'rows');
  uniqueLength = size(b, 1);
  ratio = uniqueLength / origLength;
  printf('Object %d: ', k);
  if (ratio > upperThr)
    printf('2d object\n');
  elseif (ratio < lowerThr)
    printf('1d object\n');
  else
    printf('No idea\n');
  end
end

有很多 space 代码改进,我想保持它的可读性和易于理解。欢迎单线恋物癖者为所欲为。 ;-)