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 I
de 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: rho
foi 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 hough
matriz-emrho_idx, theta_idx
, eu traduzo os índices para rho,theta
valores:
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)
.