2017-10-12 64 views
2

我在硬币图像中用绿色标记了一个硬币(绿色),并在其上通过一条线。我如何找到它们相交的x,y点? 在此先感谢。线和对象的交点 - Matlab

enter image description here

clc; 
clear; 

I = imread('coins.png'); 
BW = im2bw(I); 

BW_filled = imfill(BW,'holes'); 

boundaries = bwboundaries(BW_filled); 
figure,imshow(I) ; 

hold on; 

b = boundaries{1}; 
plot(b(:,2),b(:,1),'g','LineWidth',1); 

h = imline; 
myPoints = wait(h); 
delete(h) ; 
x1 = round(myPoints(1,1),2); 
y1 = round(myPoints(1,2),2); 
x2 = round(myPoints(2,1),2); 
y2 = round(myPoints(2,2),2); 

%plot line 
x=[x1 x2]; 
y=[y1 y2]; 
plot(x',y','r') 

回答

4

找到线和圆圈之间的交叉点。

k = abs((b(:,2)-x1) * (y2-y1) - (b(:,1)-y1) * (x2-x1)); 
[~,idx] = sort(k); 
scatter(b(idx(1:2),2), b(idx(1:2),1)) 

这是一个简单的方法。它捕获圆上的所有点,并检查每个点对line equation

理想情况下,我们有(x-x1)/(x2-x1) = (y-y1)/(y2-y1),或说d = (x-x1)/(x2-x1) - (y-y1)/(y2-y1),然后d=0是理想的情况。当该点偏离该线时,d的绝对值增加。因此,最小的d指的是最接近该线的点。在这种情况下,应该有两点,因此我正在寻找两个最小的值。

一个可能的问题可能是准确性。当圆上的点彼此相距很远时,可能最近的两个点代表相同的交点,而另一个点未被检测到。更复杂的检查将适用,例如选择最接近的四个然后区分。但是,您可以通过保持点密度来避免这种情况。


编辑:增加了这样的检查。

k = abs((b(:,2)-x1) * (y2-y1) - (b(:,1)-y1) * (x2-x1)); 
[~,idx] = sort(k); 

f4x = b(idx(1:4),2); 
f4y = b(idx(1:4),1); 
choose = [1,2;1,3;1,4;2,3;2,4;3,4]; 
dist = sqrt((f4x(choose(:,1))-f4x(choose(:,2))).^2 + .... 
    (f4y(choose(:,1))-f4y(choose(:,2))).^2); 
[~, idx2] = sort(dist,'descend'); 

px = b(idx(choose(idx2(1,:),:).'),2); 
py = b(idx(choose(idx2(1,:),:).'),1); 

scatter(px, py) 

一些结果

>> idx(1:4) 

ans = 

    28 
    112 
    113 
    29 

>> dist 

dist = 

    55.7853 
    55.5428 
    1.0000 
    1.0000 
    55.5428 
    55.3173 
+0

有没有一种方法,使之更加敏感?例如通过添加所有这些点之间的距离 – hsi

+0

@ user2676173是的,您可以添加检查前四个点之间的相对距离。寻找第一对两个分开的可辨距离。 – Yvon

+0

是否有可能用点替换散点图? – user2916044