FFT para detección de línea

8

Estoy tratando de usar la FFT de una manera diferente a la que la mayoría de la gente pregunta. Quiero poder tomar una foto de un gráfico con líneas verticales regulares repetidas y procesar la imagen para determinar qué tan lejos en píxeles están las líneas separadas en promedio. He intentado la detección de bordes irregulares y la detección de líneas hough y no creo que pueda optimizar las imágenes lo suficiente como para detectar con precisión solo las líneas que me interesan.

Entonces, mi intento es escanear 10 líneas de la imagen y acumular los valores de píxeles en contenedores correspondientes a la columna de píxeles. Lo que resulta cuando grafica es una forma de onda muy bonita. Cuando realizo un DFT o FFT en esto, puedo encontrar un pico que creo que debería ser la frecuencia de la repetición de la línea. (Esto puede ser una suposición defectuosa)

Mi pregunta es, ¿a qué corresponde este número? es decir, creo que estoy confundido con cuál sería mi frecuencia de muestreo porque está en píxeles. Creo que este es un uso válido de la FFT, pero estoy cayendo justo aquí en el momento en que creo que debería tener éxito.

Como ejemplo. Creé una imagen que tiene 300 píxeles de ancho. Hay líneas de 1 píxel de ancho dibujadas exactamente a intervalos de 30 píxeles. Encontré 2 picos, uno en 75 y otro en 225 (que parecen simétricos) para el componente real. (No creo que el componente imaginario deba reproducirse) Sé que las líneas están separadas por 30 píxeles. ¿Cómo se relacionan los 75 y 225?

Estoy intentando realmente conseguir esto, y estoy agradecido por cualquier ayuda que me puedan recomendar. En este punto, renuncio a la detección de bordes y quiero probar este enfoque.

Gracias de antemano.


fuente
¡Muchas gracias a todos por sus respuestas! La FFT simplemente no parece estar funcionando. ¿Cómo agregaría el componente imaginario? El programa que uso (stat plus) solo escupe una columna de números reales e imaginarios. Había estado trazando lo real en el eje x, pero estoy seguro de que hay una mejor manera de incluir números imaginarios. Además, ¡seguí el camino de la autocorrelación y obtuve un resultado! dulce !, pero siempre trae más preguntas. El resultado que obtengo es el doble del tamaño de la imagen original (comprensiblemente), que oscila mucho más limpio cerca del centro. ¿Hay alguna rima o razón para

Respuestas:

6

Puede considerar intentar la Autocorrelación para esto. Aquí hay una respuesta SO que describe cómo realizar la autocorrelación con Matlab utilizando FFT. Esto podría extenderse por dos dimensiones.

Implementé su caso de prueba en numpy de la siguiente manera:

a = np.zeros(300)
a[::30] = 1
plt.acorr(a, maxlags=50)

Esto da la siguiente trama:

ingrese la descripción de la imagen aquí

Como puede ver, los picos aparecen a +/- 30.

mevatron
fuente
4

Si hay 10 líneas verticales en su imagen, entonces una FFT de una línea de exploración horizontal completa (300 pix) debería mostrar cierto contenido de magnitud alrededor del bin 10 o el bin 11. El bin 75 de 300 indicaría que algo está sucediendo cada cuarto píxel, o entonces.

Realmente necesita observar la magnitud del resultado FFT, no solo el componente "real" (realmente el componente par) porque, si sus líneas de cuadrícula están descentradas, el contenido espectral podría aparecer como extraño (por lo tanto, "imaginario" en el resultado FFT).

Dada la entrada real a una FFT, los contenedores de resultados por encima de N / 2 (por encima de 150 en su caso) solo contienen repeticiones de los mismos datos, excepto complejos conjugados. Entonces puedes ignorarlos.

hotpaw2
fuente
0

FFTFFTFFT(1)(x+y))FFT

No estoy muy seguro de esto, pero algo me dice que la distancia (en píxeles) entre el pico y el centro indicaría la periodicidad. Una vez que tenga la periodicidad, puede llegar fácilmente a la distancia entre cada objeto.

Rounak
fuente