2016-02-27 131 views
-1

我正在计算凸包边界和图像中的点。这是我迄今为止计算凸包区域所做的工作。计算凸包边界

在最后的子图中,我想计算图像中的凸包点并连接这些点。有人能帮我一下吗?

输入图像出现在这个link

谢谢..

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'); 

回答

2

如果我理解正确你的目标是什么,你可以做这样的事情:

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)将返回(如你的情况)

enter image description here

figure(2)将返回

enter image description here

最后figure(3)返回

enter image description here

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