выбор линии с помощью преобразования Хафа


Задача: Найти нежелательную линию на изображении с помощью преобразования Хафа.

Введите описание изображения здесь

Я сделал следующее,

    Примените направленный фильтр для анализа 12 различных направлений, повернутых относительно друг друга на 15°.
  1. примените пороговое значение для получения 12 двоичных изображений.

Введите описание изображения здесь

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

Я попробовал следующий код. Кажется, это не работает.

код MATLAB

    %   Read 12 images into workspace.
input_images  = {imread('1.png'),imread('2.png'),imread('3.png'),...
    imread('4.png'),imread('5.png'),imread('6.png'),...
    imread('7.png'),imread('8.png'),imread('9.png'),...
    imread('10.png'),imread('11.png'),imread('12.png')};

longest_line = struct('point1',[0 0], 'point2',[0 0], 'theta', 0, 'rho', 0);

for n=1:12
    %Create a binary image.
    binary_image = edge(input_images{n},'canny');

    %Create the Hough transform using the binary image.
    [H,T,R] = hough(binary_image);

    %Find peaks in the Hough transform of the image.
    P  = houghpeaks(H,3,'threshold',ceil(0.3*max(H(:))));

    %Find lines
    hough_lines = houghlines(binary_image,T,R,P,'FillGap',5,'MinLength',7);         
    longest_line = FindTheLongestLine(hough_lines, longest_line);
end


% Highlight the longest line segment by coloring it cyan.
plot(longest_line.point1, longest_line.point2,'LineWidth',2,'Color','cyan');

.

Соответствующий Исходный Код

function longest_line = FindTheLongestLine( hough_lines , old_longest_line)
%FINDTHELONGESTLINE Summary of this function goes here
%   Detailed explanation goes here
    longest_line = struct('point1',[0 0] ,'point2',[0 0],'theta', 0, 'rho', 0);

    max_len = 0;

    N = length(hough_lines);

    for i = 1:N
       % Determine the endpoints of the longest line segment
       len = LenthOfLine(hough_lines(i));

       if ( len > max_len)
          max_len = len;
          longest_line = hough_lines(i);
       end
    end

    old_len = LenthOfLine(old_longest_line);
    new_len = LenthOfLine(longest_line);

    if(old_len > new_len)
       longest_line =  old_longest_line;
    end
end

function length = LenthOfLine( linex )
%LENTHOFLINE Summary of this function goes here
%   Detailed explanation goes here

    length = norm(linex.point1 - linex.point2);
end

Тестовые Изображения

Здесь представлены 12 изображений, drive.google.com/open?id=0B-2FDw63ZNTnRnEzYlNyS0V4YVE

2 3

2 ответа:

Проблема с вашим кодом-это свойство FillGap houghlines. Вы должны разрешить большие пробелы в возвращаемых строках, потому что искомая строка не должна быть непрерывной, например 500:

hough_lines = houghlines(binary_image,T,R,P,'FillGap',500,'MinLength',7);

Это находит самую большую линию на изображении 7, как требуется.

Визуализация

Для построения найденной линии поверх изображения можно использовать следующий код:

figure
imshow(input_images{7});
hold on
% Highlight the longest line segment by coloring it cyan.
plot([longest_line.point1(1) longest_line.point2(1)], [longest_line.point1(2) longest_line.point2(2)],'LineWidth',2,'Color','cyan');

Введите описание изображения здесь

Нахождение максимального пика в преобразовании Хоу

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

longest_line = ...
largest_H = 0; % init value

for n=1:12
    binary_image = edge(input_images{n},'canny');
    [H,T,R] = hough(binary_image);
    P  = houghpeaks(H,1,'threshold',ceil(0.3*max(H(:))));
    hough_lines = houghlines(binary_image,T,R,P,'FillGap',500,'MinLength',7);         

    if (largest_H < H(P(1, 1), P(1, 2)))
        largest_H = H(P(1, 1), P(1, 2));
        longest_line = hough_lines(1);
        longest_line.image = n;
    end
end

При этом выбирается следующая строка на рисунке 6, которая является другим допустимым результатом:

Введите описание изображения здесь

Вы можете попробовать изменить параметры функций Хоу в соответствии с вашей конкретной проблемой, это не идеальное решение, но оно может быть достаточно хорошим для вас:

img = im2double(rgb2gray(imread('line.jpg')));
% edge image
BW = edge(img,'canny');
% relevant angles (degrees) interval for the line you want
thetaInterval = -80:-70;
% run hough transform and take single peak
[H,T,R] = hough(BW,'Theta',thetaInterval);
npeaks = 1;
P = houghpeaks(H,npeaks);
% generate lines
minLen = 150; % you want the long line which is ~250 pixels long
% merge smaller lines (same direction) within gaps of 30 pixels
fillGap = 30; 
lines = houghlines(BW,T,R,P,'FillGap',fillGap,'MinLength',minLen );
% plot
imshow(img);
hold on
xy = [lines.point1; lines.point2];
plot(xy(:,1),xy(:,2),'g','LineWidth',2);

Введите описание изображения здесь