我有一张二进制图像,其中有曲线,如下所示,但我想知道如果它们被延伸,它们在哪里相交。
那么,你能给我一些关于以下问题的建议吗:
感谢您的帮助
那么,你能给我一些关于以下问题的建议吗:
- 延长线的端点,使其朝同一个方向
- 如何找到相交点?
感谢您的帮助
(*Code in Mathematica*)
Erosion[Dilation[i, 10], 10]
一个完整的解决方案可能是这样的:
r = Dilation[MorphologicalBranchPoints[
Thinning[Binarize@Erosion[Dilation[i, 10], 10], 10]] // Colorize, 3]
ImageAdd[i, r]
我认为你应该看一下霍夫变换。它可以从二进制表示(通常是边缘检测器的输出)中计算出直线方程。一旦你有了这些方程,计算相交点就像解决简单的难题一样容易。
使用霍夫变换,我得出了以下结果:
%# 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
仅仅看你的线条,它们更多或少是直线(非凸/凹曲线)。以我微薄之见,有一种更简单、更显而易见的方法,因为你知道三条线的任意两个端点。你总是可以通过分别解出x和y来得到交点。
http://zonalandeducation.com/mmts/intersections/intersectionOfTwoLines1/intersectionOfTwoLines1.html
祝好运
std :: vector >
中,使用OpenCV库的findContours函数,然后对于任何不相交的两个轮廓(相交情况稍后解释),执行以下操作:
第一个轮廓是2D点A1 A2 .... An的序列,第二个轮廓是B1、B2、..、Bm,固定某些i > 0 && i < n,j > 0 && j < m,并使用(A1,...,Ai)进行外推以找到第一个轮廓的第一个端点的延伸,然后外推(An-i,...,An)以找到第一个轮廓的第二个端点的延伸:对于第二个轮廓(B1,...,Bj)和(Bm-j,...,Bm)也是如此:
现在,您可以将轮廓延伸到图像边界并检查它们是否相交。
我希望您知道如何在2D空间中找到线段的交点。 您必须对所有[Ai Ai + 1]和[Bj Bj + 1] i = 1,...,n-1和j = 1,...,m-1使用此功能。