Преобразование Хафа в MATLAB

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

A = zeros(7,7);
A([6 10 18 24 36 38 41]) = 1;

Использование формата (ро; тета) с тета с шагом 45° от -45° до 90°. И как мне показать массив аккумуляторов в MATLAB.

Любая помощь или подсказки, пожалуйста?

Спасибо!


person Glove    schedule 13.07.2011    source источник


Ответы (2)


Если у вас есть доступ к Image Processing Toolbox, вы можете использовать функции HOUGH, HOUGHPEAKS и HOUGHLINES:

%# your binary image
BW = false(7,7);
BW([6 10 18 24 36 38 41]) = true;

%# hough transform, detect peaks, then get lines segments
[H T R] = hough(BW);
P  = houghpeaks(H, 4);
lines = houghlines(BW, T, R, P, 'MinLength',2);

%# show accumulator matrix and peaks
imshow(H./max(H(:)), [], 'XData',T, 'YData',R), hold on
plot(T(P(:,2)), R(P(:,1)), 'gs', 'LineWidth',2);
xlabel('\theta'), ylabel('\rho')
axis on, axis normal
colormap(hot), colorbar

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

houghлинии

person Amro    schedule 14.07.2011

Каждый пиксель (x, y) соответствует набору линий (rho, theta), которые проходят через него.

  1. Постройте накопительную матрицу, проиндексированную (rho theta).
  2. Для каждой включенной точки (x, y) сгенерируйте все квантованные (rho, theta) значения, соответствующие (x, y), и увеличьте соответствующую точку в аккумуляторе.
  3. Нахождение самых сильных линий соответствует нахождению пиков в аккумуляторе.

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

в псевдокоде с привилегиями:

accum = zeros(360,100);
[y,x] = find(binaryImage);
y = y - size(binaryImage,1)/2;  % use locations offset from the center of the image
x = x - size(binaryImage,2)/2;
npts = length(x);
for i = 1:npts
    for theta = 1:360  % all possible orientations
        rho = %% use trigonometry to find minimum distance between origin and theta oriented line passing through x,y here
        q_rho = %% quantize rho so that it fits neatly into the accumulator %% 
        accum(theta,rho) = accum(theta,rho) + 1;
    end
end
person BlessedKey    schedule 13.07.2011
comment
Ницца спасибо!!! Вы знаете, как показать массив аккумуляторов? я использую imshow(accum); ? - person Glove; 14.07.2011
comment
Вы знаете, как отобразить самую сильную линию на изображении? - person Glove; 14.07.2011
comment
самая сильная линия — это та, которая соответствует точке в аккумуляторе с наибольшим количеством признаков. [best_th, best_rho] = ind2sub(size(accum),max(accum(:)); - person BlessedKey; 14.07.2011
comment
Вы не должны проверять все 360 градусов. Вам нужно только 180. - person Cameron Lowell Palmer; 24.12.2015