Próbuję użyć transformacji Hougha do wykrywania krawędzi i chciałbym wykorzystać obrazy gradientowe jako podstawę.
Co zrobiłem do tej pory, ze względu na obraz I
wielkości [M,N]
i jej pochodnych cząstkowych gx
, gy
jest obliczenie kąta gradientu w każdym pikselu jako thetas = atan(gy(x,y) ./ gx
. Podobnie obliczam wielkość gradientu jako magnitudes = sqrt(gx.^2+gy.^2)
.
Aby zbudować transformację Hougha, używam następującego kodu MATLAB:
max_rho = ceil(sqrt(M^2 + N^2));
hough = zeros(2*max_rho, 101);
for x=1:M
for y=1:N
theta = thetas(x,y);
rho = x*cos(theta) + y*sin(theta);
rho_idx = round(rho)+max_rho;
theta_idx = floor((theta + pi/2) / pi * 100) + 1;
hough(rho_idx, theta_idx) = hough(rho_idx, theta_idx) + magnitudes(x,y);
end
end
Wynikowa transformacja Hougha wygląda wiarygodnie (patrz http://i.stack.imgur.com/hC9mP.png ), ale kiedy próbuję użyć jej maksimów jako parametrów krawędzi na oryginalnym obrazie, wyniki wyglądają mniej więcej losowo. Czy zrobiłem coś złego w konstruowaniu transformacji Hougha?
AKTUALIZACJA : Miałem głupi błąd w moim kodzie: rho
został obliczony jako x*cos(theta)+y*cos(theta)
zamiast x*cos(theta)+y*sin(theta)
. To znaczy, użyłem dwóch cosinusów zamiast cosinusa i sinusa. Edytowałem powyższy kod, a nowy wynikowy obraz znajduje się poniżej. Nie dało to jednak znacznie lepszych krawędzi.
@endolith: Aby wykreślić krawędź, biorąc pod uwagę maksymalną wartość w hough
macierzy na rho_idx, theta_idx
, tłumaczę indeksy na rho,theta
wartości:
theta = (theta_idx -1) / 100 * pi - pi / 2;
rho = rho_idx - max_rho;
Wreszcie wykreślam krawędź jako y= (rho - x*cos(theta)) / sin(theta)
.