在霍夫变换后检测相交线

时间:2012-04-27 18:50:51

标签: matlab hough-transform line-intersection parametric-equations

在Matlab中使用Hough变换,检测到一些行。使用这些线的终点我绘制了它们。当我拥有所有变量时,我无法理解如何找到相交线。

Line7
Point1 [50,66]
Point2 [11,106]
theta,rho [45,81]


Line9
Point1 [19,83]
Point2 [53,79]
theta,rho [82,84]

由于参数方程如下

  rho = xCos(theta) + ySin(theta)

我不确定如何解决这个问题。有了所有这些信息,必须有一种快速的方法来查找线是否相交,如果是,则也是如此。

非常感谢任何指导。

function FindHoughLines(I,filename)
[H,T,R] = hough(I);
rotI = imrotate(I,0,'crop');
imshow(H,[],'XData',T,'YData',R,...
            'InitialMagnification','fit');
xlabel('\theta'), ylabel('\rho');
axis on, axis normal, hold on;
P  = houghpeaks(H,10,'threshold',ceil(0.1*max(H(:))));
x = T(P(:,2)); y = R(P(:,1));
 plot(x,y,'s','color','white');
% Find lines and plot them
lines = houghlines(I,T,R,P,'FillGap',5,'MinLength',7);
 figure, imshow(rotI), hold on
max_len = 0;
for k = 1:length(lines)
    if(isField(lines,'point1') ~= 0)               
   xy = [lines(k).point1; lines(k).point2];
    plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');

   % Plot beginnings and ends of lines
   plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');
   plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');
   text(xy(1,1),xy(1,2),[ num2str(k)],'HorizontalAlignment','center','BackgroundColor',[.7 .9 .7]);
   % Determine the endpoints of the longest line segment
   len = norm(lines(k).point1 - lines(k).point2);
   if ( len > max_len)
      max_len = len;
      xy_long = xy;
   end
    end
end

Lines

2 个答案:

答案 0 :(得分:2)

最让人想到的方法是使用

将所有检测到的线转换为笛卡尔坐标
y = -ctg(theta) + r/sin(theta)

然后使用标准检测程序,如http://en.wikipedia.org/wiki/Bentley–Ottmann_algorithm

答案 1 :(得分:1)

您想要线段的交叉点吗?例如,假设您的一个线段具有端点(1,0)和(2,0),另一个具有端点(0,1)和(0,2);你想要(0,0)的交点是否计算?

你是否需要有效处理有很多行并找到所有交叉点的情况,或者可以考虑所有线对并逐一检查它们?

最简单的情况是,只考虑成对的线条,以及线条(与线段相对)交叉点是否足够好。然后,对于每对线,您只需求解两个联立线性方程:aX + bY = c,dX + eY = f。这是一件非常标准的事情;它等于反转2x2矩阵。

如果你需要注意交叉点实际上不在给定的线段内,这里有几种方法。 (1)首先是如上所述的交叉点,然后检查它是否位于每个给定的段内。您可以通过选择一个坐标(例如,x坐标)并查看它是否位于两个端点的x坐标之间来实现。当然你不能将x坐标用于垂直线,不应该用于近乎垂直的线;更好地选择具有较大系数的任何坐标。 (2)将参数化的线写为(x,y)=(x1,y1)+ t(dx1,dx1)和(x,y)=(x2,y2)+ u(dx2,dy2);现在代替x,y的联立方程式,你有t,u的联立方程式;解决这些并检查0< = t,u< = 1。

如果你需要在有很多行时有效地应对,那么就有算法; google“line sweep”找到一个非常容易理解的标准版。