Estoy tratando de usar la transformación Hough para la detección de bordes, y me gustaría usar imágenes de gradiente como base.
Lo que he hecho hasta ahora, dada la imagen I
de tamaño [M,N]
y sus derivadas parciales gx
, gy
, consiste en calcular el ángulo de pendiente en cada píxel como thetas = atan(gy(x,y) ./ gx
. Del mismo modo calculo la magnitud del gradiente como magnitudes = sqrt(gx.^2+gy.^2)
.
Para construir la transformación Hough, uso el siguiente 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
La transformación de Hough resultante parece plausible (ver http://i.stack.imgur.com/hC9mP.png ), pero cuando trato de usar sus máximos como parámetros de borde en la imagen original, los resultados parecen más o menos aleatorios. ¿Hice algo mal al construir la transformación de Hough?
ACTUALIZACIÓN : tuve un error estúpido en mi código: rho
se calculó como en x*cos(theta)+y*cos(theta)
lugar de x*cos(theta)+y*sin(theta)
. Es decir, estaba usando dos cosenos en lugar de un coseno y un seno. He editado el código de arriba y la nueva imagen resultante está debajo. Sin embargo, esto no dio mejores aristas.
@endolith: para trazar una arista, dado un valor máximo en la hough
matriz en rho_idx, theta_idx
, traduzco los índices a rho,theta
valores:
theta = (theta_idx -1) / 100 * pi - pi / 2;
rho = rho_idx - max_rho;
Finalmente trazo el borde como y= (rho - x*cos(theta)) / sin(theta)
.