Estou tentando usar a transformação Hough para detecção de borda e gostaria de usar imagens de gradiente como base.
O que tem feito até agora, dada a imagem Ide tamanho [M,N]e seus derivados parciais gx, gy, é calcular o ângulo de inclinação em cada pixel como thetas = atan(gy(x,y) ./ gx. Da mesma forma, eu calculo a magnitude do gradiente como magnitudes = sqrt(gx.^2+gy.^2).
Para criar a transformação Hough, eu uso o seguinte código 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
A transformação Hough resultante parece plausível (consulte http://i.stack.imgur.com/hC9mP.png ), mas quando tento usar seus máximos como parâmetros de aresta na imagem original, os resultados parecem mais ou menos aleatórios. Fiz algo errado na construção da transformação Hough?
ATUALIZAR : Eu tive um erro estúpido no meu código: rhofoi calculado como em x*cos(theta)+y*cos(theta)vez de x*cos(theta)+y*sin(theta). Ou seja, eu estava usando dois cossenos em vez de um cosseno e um seno. Editei o código acima e a nova imagem resultante está abaixo. Isso não deu arestas muito melhores.
@endolith: Para plotar uma aresta, dado um valor máximo na houghmatriz-emrho_idx, theta_idx , eu traduzo os índices para rho,thetavalores:
theta = (theta_idx -1) / 100 * pi - pi / 2;
rho = rho_idx - max_rho;
Finalmente eu traço a borda como y= (rho - x*cos(theta)) / sin(theta).
