如何使 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)。对每个图像边框重复此操作。
我希望,你明白我的想法。老实说,我不想完全实现它,但如果我的描述不够精确,请不要犹豫。
我的图像有 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)。对每个图像边框重复此操作。
我希望,你明白我的想法。老实说,我不想完全实现它,但如果我的描述不够精确,请不要犹豫。