Uso del filtro inverso para corregir una imagen espacialmente enrevesada (desconvolución)


8

Como parte de una tarea, estamos implementando el filtro inverso. Degradar una imagen y luego recuperarla con un filtro inverso.

Convoluvo la imagen en el dominio espacial con un filtro de caja de 5x5. FFT el filtro, FFT la imagen degradada, luego divido la imagen degradada por el filtro. Invierte el resultado FFT en una imagen y obtengo basura.

Si FFT la imagen, FFT el filtro, multiplico los dos, divido ese resultado por el filtro FFT, obviamente me acerco mucho a la imagen original. ((X * Y) / Y ~ == X)

Tengo una idea de que las matemáticas no son tan simples como "espacialmente complicado == multiplicación FFT".

¿Cuál es la forma correcta de usar el filtro inverso? Tengo el núcleo exacto utilizado degradar la imagen. No estoy agregando ningún ruido.

El libro de texto de Bovik, La guía esencial para el procesamiento de imágenes es casi completamente despectivo del filtro inverso. Gonzalez & Woods tiene un poco más de esperanza, pero casi inmediatamente salta al filtro Wiener.

Tengo una pregunta similar en stackoverflow.com /programming/7930803/inverse-filter-of-spatially-convolved-versus-frequency-convolved-image

(Estas preguntas también deben etiquetarse [tarea] pero la etiqueta aún no existe y no tengo el representante para crearla).

EDITAR. Para algunas de las excelentes sugerencias a continuación. @ dipan-mehta Antes de realizar FFT, estoy rellenando el núcleo de convolución al mismo tamaño que la imagen. Estoy poniendo el núcleo en la esquina superior izquierda. Ift (ifftshift ()) luego guardo en una imagen y obtengo un buen resultado. He hecho el ifft (ifftshift ()) tanto en el núcleo como en la imagen. Buenos (ish) resultados. (Las imágenes están en mi /programming/7930803/inverse-filter-of-spatially-convolved-versus-frequency-convolved-image question.)

@ jason-r es probablemente correcto. No entiendo las matemáticas de la convolución + transformación subyacente. "Desconvolución" era una nueva palabra para mí. Aún tengo mucho que aprender. ¡Gracias por la ayuda!

Mi solución para la tarea es hacer todo en el dominio de la frecuencia. Hablé con el profesor. Estaba haciendo la tarea más difícil de lo necesario. Ella quería que agreguemos ruido y luego probar el filtro inverso, el filtro Wiener y el filtro de mínimos cuadrados restringidos. El objetivo del ejercicio era ver cómo los filtros manejaban el ruido.


1
¿Rellena el filtro con ceros para que tenga el mismo tamaño que la imagen antes de tomar su FFT? ¿Estás haciendo la división compleja correctamente?
Dima

Sí, rellenó el filtro con ceros, núcleo en la esquina superior izquierda. Todo mi código de Python / numpy está en el enlace de stackoverflow.com mencionado anteriormente. La división compleja es probablemente mi problema.
David Poole

Respuestas:


8

Hay un par de preguntas que abordaré por separado:

  • La convolución en el dominio espacial (o correspondientemente en el dominio del tiempo para las señales muestreadas en el tiempo) es equivalente a la multiplicación en el dominio de la frecuencia. En los sistemas muestreados, hay algunas sutilezas en los casos límite (es decir, cuando se usa el DFT, la multiplicación en el dominio de frecuencia en realidad le da convolución circular, no convolución lineal), pero en general, es así de simple.

  • El filtrado inverso puro casi nunca es la solución correcta en la práctica. En la mayoría de los casos, no tiene acceso al filtro exacto que se ha aplicado a sus datos, por lo que no puede simplemente invertirlo de todos modos. Incluso si conoce el filtro, sigue siendo problemático. Considere el hecho de que el filtro puede tener ceros a ciertas frecuencias espaciales; si es así, luego de aplicar el filtro a su imagen, se pierde toda la información en esas frecuencias. Si ingenuamente invierte ese filtro, tendrá una ganancia infinita (o al menos muy alta) en esos valores nulos. Si luego aplica el inverso ingenuo a una imagen que tiene algún contenido aditivo en esas frecuencias (por ejemplo, ruido, que probablemente sea el caso), entonces ese componente no aislado se amplificará enormemente. Esto generalmente no es deseable.

    Este problema de filtrado inverso es muy similar a la ecualización en los sistemas de comunicaciones, donde este fenómeno se conoce como mejora de ruido . En ese contexto, el enfoque de filtro inverso se conoce como un ecualizador de forzamiento cero , que rara vez se usa realmente.

  • El área que está explorando se conoce más generalmente como deconvolución . Como regla general, la deconvolución es una operación difícil. Incluso si conoce el filtro exacto que se aplicó y desea deshacerlo, no siempre es tan fácil. Como notó, el enfoque de filtro inverso generalmente se descarta a favor de un filtro Wiener o alguna otra estructura que tenga como objetivo no invertir exactamente el sistema, sino estimar cuál fue la entrada al sistema mientras se minimiza algún criterio de error (minimizando la media error cuadrado es un objetivo común). Como es de esperar, la aplicación de un filtro Wiener a este problema se conoce como deconvolución Wiener .


"Desconvolución" era una nueva palabra para mí. Todavía tengo mucho que aprender. ¡Gracias!
David Poole

@JasonR ¿no tendríamos que conocer una secuencia de 'entrenador' en la imagen para la deconvolución de Wiener para que el criterio MMSE se minimice con respecto a algo que se sabe que es verdad?
Spacey

1
En general, debe conocer la densidad espectral de potencia de la señal y la función de transferencia que se ha aplicado a la señal para diseñar el filtro Wiener. Sin embargo, en el caso probable de que no conozca toda esa información, puede hacer conjeturas informadas que produzcan una estructura funcional que sea más robusta que el filtro inverso. Vea esta sección en la página de Wikipedia para una discusión.
Jason R

3

Espero que no haya cometido un error en la forma en que se realiza el cálculo:

Convoluvo la imagen en el dominio espacial con un filtro de caja de 5x5. FFT el filtro, FFT la imagen degradada, luego divido la imagen degradada por el filtro. Invierte el resultado FFT en una imagen y obtengo basura.

Suponga que su imagen tiene un tamaño de 256x256 y un filtro de 5x5; para aplicar el filtrado multiplicando las FFT, primero debe convertir el filtro a un tamaño equivalente. Para esto, debe mantener el filtro de caja de 5x5 en la "esquina SUPERIOR" (no el centro de la imagen) y rellenarlo con ceros para llenar 256x256; debe obtener un FFT de 256x256 para el filtro.

Para ayudar a diagnosticar, en el paso 1 de programación, primero tome solo 256x256 FFT de filtro solo y verifique si la rutina IFFT puede devolverle el filtro. Prueba de la misma manera si FFT -> IFFT de la imagen en sí funciona al revés correctamente.

Paso 2: si solo aplica el filtro (y no el filtro inverso) en el dominio FFT multiplicando, verifique la imagen resultante después de que IFFT esté bien. Debería ser básicamente una imagen borrosa.

Si toda su programación es correcta, asegúrese de que cuando haga 1 / x para el coeficiente FFT no haya un error de división por cero y, a la inversa, cuando haya un pico máximo, las multiplicaciones resultan en grandes distorsiones.

En general, para cualquier filtro estable , el filtro inverso por definición inestable, esta podría ser la razón principal. Sin embargo, siempre me gustaría verificar la implementación antes de explorar los límites teóricos.

Si se hace bien, he visto que la multiplicación en FFT es una convolución en el espacio muestral tanto para las imágenes como para las señales de audio.

Dipan

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.