Как найти пересечения в бинарных линиях изображения? - PullRequest
6 голосов
/ 12 июля 2011

У меня есть двоичное изображение с изогнутыми линиями, как показано ниже, но я хотел бы знать, как я могу найти, где они будут пересекаться, если они расширены.

Так что вы могли бы дать мне несколько идей о том, как яможет:

  • расширить конечные точки линии в том же направлении,
  • как найти пересечения?

Я думал об использовании грубого преобразования, чтобы найтилинии, затем пересечение, но на некоторых изображениях мои конечные точки не совсем прямые.Можно ли найти направление только в конце строки, а не по всей строке, поскольку это двоичное изображение?

Спасибо за любую помощь c a b

Ответы [ 6 ]

4 голосов
/ 13 июля 2011

Применение расширения и затем эрозия расширит ваши конечные точки следующим образом:

(*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

4 голосов
/ 12 июля 2011

Думаю, вам стоит взглянуть на Преобразование Хафа .Он рассчитывает уравнения линий по двоичной репрезентации (обычно вывод детектора фронта).Если у вас есть это, это просто кусок для расчета пересечений.

3 голосов
/ 12 июля 2011

Вы можете попытаться подобрать три соответствующие кривые, а затем явно решить уравнение для двух пересечений.

Существуют некоторые установленные модели для подгонки кривой.

2 голосов
/ 17 июля 2011

Вот то, что я придумал, используя Hough Transform:

%# 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

1 голос
/ 12 июля 2011

Просто глядя на ваши линии, они являются более или менее прямыми линиями (не вогнутыми / выпуклыми кривыми). По моему скромному мнению, есть более простой и более очевидный способ, поскольку вы знаете обе конечные точки трех линий. Вы всегда можете получить пересечение, решая x и y соответственно.

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

Бог удачи

0 голосов
/ 13 июля 2011

заполните контуры в std::vector<std::vector<cv::Point> >, используя функцию findContours из библиотеки OpenCV, затем для любых двух контуров, которые не пересекаются (случай пересечения я объясню позже), сделайте следующее: Первый контур - это последовательность двухмерных точек A1 A2 .... Второй контур - это B1, B2, .., Bm, исправьте некоторые i> 0 && i 0 && j

...