我在硬币图像中用绿色标记了一个硬币(绿色),然后在它上面划了一条线。如何找到它们相交的x,y点? 提前谢谢。
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')
答案 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