如果我理解正确你的目标是什么,你可以做这样的事情:
close all;
figure(1);
subplot(2,2,1);
I = imread('shape.jpg');
imshow(I);
title('Original');
subplot(2,2,2);
BW = im2bw(I, 0.5);
BW = imcomplement(BW);
imshow(BW);
title('Binary');
subplot(2,2,3);
CH_objects = bwconvhull(BW,'objects');
imshow(CH_objects);
title('Objects Convex Hull');
figure(2);
[r,c]=find(CH_objects);
CH=convhull(r,c);
plot(r(CH),c(CH),'*-');
figure(3);
[r2,c2]=find(BW);
CH2=convhull(r2,c2);
plot(r2(CH2),c2(CH2),'*-');
让我们看看这段代码更详细的内容。
为了清晰起见,我绘制了最终的地块figure(2)
和figure(3)
,所以subplot()
不会改变。
然而,在CH_objects
,我们使用find()
estrapolate所有白色点的坐标(行r1
和列c1
)。在这些点上,我们执行凸包,并在CH1
中返回凸包点的索引。现在我们在figure(2)
中绘制这些点的坐标,其中每个点用星号*
标记,以及连接这些点的法线。
此外,你可以做同样的事情,但从BW图像开始,而不是从CH_objects
。所以你打开第三个数字并重复相同的程序,但是从BW
开始。
在这种情况下figure(1)
将返回(如你的情况)

而figure(2)
将返回

最后figure(3)
返回

很明显,您可以随意在您的副图中重新排列这些图。您可以选择第一种解决方案或第二种解决方案,具体取决于您是要使用第3个(CH_objects
)还是第2个(BW
)图像作为起点。