Cómo implementar una transformación de Hough basada en gradiente


9

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 Ide 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: rhose 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 houghmatriz en rho_idx, theta_idx, traduzco los índices a rho,thetavalores:

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).

Nuevo resultado


"cuando trato de usar sus máximos como parámetros de borde en la imagen original" ¿Cómo lo haces?
Endolith

Debido @Jonas Vesterheden Sólo me preguntaba esta imagen es la frecuencia Doppler un momento VS ...?
Spacey

@Mohammad: No que yo sepa. La imagen original es de alguna placa de circuito. ¿Qué quieres decir con "VS"?
Jonas Due Vesterheden

@JonasDueVesterheden 'VS' solo significa 'versus'. (Tiempo versus frecuencia doppler ') :-)
Spacey

Debe suavizar su mapa de hough antes de aplicarle la supresión Non max.

Respuestas:


2

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 houghfunció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.


1

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 ().


¡Gracias por la sugerencia! Según tengo entendido, debería ser suficiente usar los ángulos de -90 a +90 grados, ya que las "direcciones" de los bordes no importan. Intenté usarlo atan2, pero no pareció solucionar los problemas.
Jonas Due Vesterheden
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.