如何使 bwboundaries 的端点在 Matlab 中保持一致?

How make endpoints of bwboundaries consistent in Matlab?

我的图像有 2 个边

如果我用下面的代码绘制边缘的边界:

imshow(I); hold on; [B,L,N] = bwboundaries(I);
for k=1:length(B),
    boundary = B{k};
    BL=size(boundary);
    plot(boundary(1,2), boundary(1,1), '*g','MarkerSize',15);
    for j=1:10:BL(1)
        plot(boundary(j,2), boundary(j,1), '.r','MarkerSize',5);
    end

end

如上图所示,左边缘的起点(绿色星号)在图像的左侧,这是我所期望的。但是,右边缘的起点是向中间

显然这是因为bwboundaries处理顺时针方向的跟踪对象,而第二条边需要逆时针跟踪才能在图像的右边界开始和结束

Matlab 如何能够从 bwboundaries 获取位置并正确确定右侧边的端点?

不是您问题的完整答案,而是我想出的一个主意。您可以检查边界的所有点 "closeness" 到图像边界,然后找到 minimum/maximum (x, y) 值,这将描述您感兴趣的那些 "ends" .

B = bwboundaries(img);

% Threshold for "closeness" to an image border.
thrNear = 5;

for k = 1:numel(B)

  b = B{k};

  nearTop = b(:, 1) < thrNear;
  nearBottom = b(:, 1) > (size(img, 1) - thrNear);
  nearLeft = b(:, 2) < thrNear;
  nearRight = b(:, 2) > (size(img, 2) - thrNear);

  closeToTop = b(nearTop, :)
  closeToBottom = b(nearBottom, :)
  closeToLeft = b(nearLeft, :)
  closeToRight = b(nearRight, :)

end

例如,对于原始图像中的正确形状,您得到:

closeToTop = [](0x2)
closeToBottom = [](0x2)
closeToLeft = [](0x2)
closeToRight =

    79   283
    79   284
    79   285
    79   286
    79   287
    80   287
    81   287
    81   286
    81   285
    81   284
    81   283
   215   283
   215   284
   215   285
   215   286
   215   287
   216   287
   217   287
   217   286
   217   285
   217   284
   217   283

现在,寻找最大 x 值 (287),并找到合适的(非相邻)y 值(79-81 与 215-217)。对每个图像边框重复此操作。

我希望,你明白我的想法。老实说,我不想完全实现它,但如果我的描述不够精确,请不要犹豫。