线与物的交点 - Matlab

时间:2017-10-12 19:34:02

标签: matlab

我在硬币图像中用绿色标记了一个硬币(绿色),然后在它上面划了一条线。如何找到它们相交的x,y点? 提前谢谢。

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

1 个答案:

答案 0 :(得分: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