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.
Respuestas:
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:
Esto da la siguiente trama:
Como puede ver, los picos aparecen a +/- 30.
fuente
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.
fuente
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.
fuente