Хау превратить в MATLAB - PullRequest
       55

Хау превратить в MATLAB

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

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

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

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

Любая помощь или советы, пожалуйста?

Спасибо!

Ответы [ 2 ]

5 голосов
/ 14 июля 2011

Если у вас есть доступ к панели инструментов обработки изображений, вы можете использовать функции 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 lines

1 голос
/ 13 июля 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
...