如何在二进制图像行中找到交叉点?

时间:2011-07-12 11:14:00

标签: matlab image-processing computer-vision

我有一个带有曲线的二进制图像,如下所示,但我想知道如果它们被扩展,我将如何找到相交的位置。

那么你能给我一些关于我如何能力的想法:

  • 以相同方向延伸线端点
  • 如何找到十字路口?

我已经考虑过使用霍夫变换来寻找线,然后用交叉点,但在某些图像中我的线端点并不完全是直的。有没有办法可能只在它的末尾找到线的方向而不是整条线,因为它是一个二进制图像?

感谢您的帮助 c a b

6 个答案:

答案 0 :(得分:4)

我认为你应该看看Hough transform。它从二进制表示(通常是边缘检测器的输出)计算线方程。一旦你有这个,计算交叉点是一块蛋糕。

答案 1 :(得分:4)

应用扩张然后侵蚀将扩展您的端点,如下所示:

(*Code in Mathematica*)
Erosion[Dilation[i, 10], 10]

enter image description here

完整的解决方案可能是这样的:

r = Dilation[MorphologicalBranchPoints[
   Thinning[Binarize@Erosion[Dilation[i, 10], 10], 10]] // Colorize, 3]
ImageAdd[i, r]

enter image description here

答案 2 :(得分:3)

您可以尝试拟合三条相应的曲线,然后明确地求解两个交点的等式。

存在一些已建立的曲线拟合模型。

答案 3 :(得分:2)

以下是我使用霍夫变换得出的结果:

%# read and binarize image
I = imread('http://i.stack.imgur.com/XlxmL.jpg');
BW = im2bw(rgb2gray(I));

%# hough transform, detect peaks, then get lines segments
[H T R] = hough(BW, 'Theta',-10:10);   %# specific theta range
P  = houghpeaks(H, 5);
lines = houghlines(BW, T, R, P);

%# overlay detected lines over image
figure, imshow(BW), hold on
for k = 1:length(lines)
    xy = [lines(k).point1; lines(k).point2];
    plot(xy(:,1), xy(:,2), 'g.-', 'LineWidth',2);
end

%# find endpoints (intersections) and show them
xy = [vertcat(lines.point1);vertcat(lines.point2)];
[~,idx1] = min(xy(:,2));
[~,idx2] = max(xy(:,2));
xy = xy([idx1;idx2],:);     %# intersection points
plot(xy(:,1),xy(:,2), 'ro', 'LineWidth',3, 'MarkerSize',12)
hold off

screenshot

答案 4 :(得分:1)

简单地看一下你的线条,它们或多或少是直线(不是凹/凸曲线)在我看来,有一种更简单的方法和更明显的方式,因为,你知道三条线的两个端点。您总是可以通过分别求解x和y来得到交点。

http://zonalandeducation.com/mmts/intersections/intersectionOfTwoLines1/intersectionOfTwoLines1.html

gd luck

答案 5 :(得分:0)

使用OpenCV库中的findContours函数将轮廓填充到std::vector<std::vector<cv::Point> >中,然后对于任何两个不相交的轮廓(稍后将解释交叉的情况)执行以下操作: 第一轮廓是2D点A1 A2的序列.An和第二轮廓是B1,B2,...,Bm,修复一些i> 0&amp;&amp;我&lt; n,j> 0&amp;&amp; j&lt; m并使用(A1,...,Ai)进行外推,以寻找从第一个轮廓的第一个端点延伸而不是外推(An-i,...,An)以从第二个端点找到第一个轮廓的延伸:同样地这样做对于第二轮廓(B1,...,Bj)&amp;&amp;(Bm-j,...,Bm): 现在你可以扩展你的轮廓直到图像和检查的边界是否相交。 我希望你知道如何在2D空间中找到段的交集。您必须将此用于所有[Ai Ai + 1]和[Bj Bj + 1] i = 1,...,n-1&amp;&amp; j = 1,...,m-1