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)
.
fuente
Respuestas:
Estoy un poco confundido por tu pregunta. La transformación de Hough se usa para detectar líneas, no bordes.
Si todo lo que desea es un mapa de bordes, simplemente debe limitar la magnitud del gradiente o usar algo más elegante como el detector de bordes Canny.
Si desea detectar líneas rectas, sería mejor comenzar con un mapa de bordes y luego usar la
hough
función de la caja de herramientas Procesamiento de imágenes, si tiene acceso a ella. El problema de hacer una transformación de Hough en el gradiente es que los píxeles de borde que forman una línea recta pueden tener orientaciones de gradiente opuestas. Por ejemplo, considere un patrón de tablero de ajedrez. Un borde entre dos filas de cuadrados cambia de orientación dependiendo de si tiene un cuadrado negro arriba y un cuadrado blanco debajo, o al revés.En cuanto a su implementación, creo que el problema es que los contenedores en su matriz Hough son demasiado pequeños. Esencialmente, el tamaño del depósito en la dimensión rho es 1, y el tamaño del depósito en la dimensión theta es inferior a 2 grados. Eso significa que las orientaciones de gradiente deben iluminarse con mucha precisión para formar una línea, lo que rara vez ocurre en la práctica. Si calcula rho_idx y theta_idx para que los contenedores sean más grandes, su detector de líneas será más tolerante a los errores y podría obtener mejores líneas.
fuente
No tengo idea de si esto es un problema, pero atan () solo le da ángulos de -90 a +90 grados debido a la ambigüedad del cuadrante. Para obtener el ángulo de gradiente completo (de -180 a 180) necesita usar atan2 ().
fuente
atan2
, pero no pareció solucionar los problemas.