Tengo una imagen 2D, que quiero filtrar paso bajo, con estas restricciones / métricas de calidad:
- No puedo "agregar" luz a la imagen, por lo que cada píxel en el resultado debe ser <= el píxel correspondiente en la entrada.
- La frecuencia de corte de paso bajo debe ser un parámetro para experimentar con
- La aplicación de este filtro repetidamente no debería cambiar el resultado de manera significativa.
- El tiempo que lleva ejecutar este algoritmo (5 minutos para una imagen de 5MPix parece razonable)
- Minimizando la cantidad de luz que se filtra.
A continuación se presentan algunos enfoques que he probado, junto con sus defectos:
Filtro gaussiano como de costumbre, luego baje el resultado para cumplir con la restricción 1. Esto cumple muy bien con los primeros 3 puntos, pero reduce mucha más luz de la necesaria.
Ajustar parábolas "hacia arriba" a través de los puntos "bajos" y parábolas "hacia abajo" entre ellas para suavizarlas. Esto funciona muy bien en 1D, pero aplicarlo primero horizontalmente y luego verticalmente produce malos resultados en 2D. Tarda mucho más, pero no demasiado para mi aplicación. Sin embargo, la aplicación repetida de este filtro cambiará drásticamente el resultado. Si la entrada (1D) es una parábola "hacia abajo" perfecta (que no debe filtrarse en absoluto), será reemplazada por 2 parábolas "hacia arriba" situadas al inicio / final.
Usando alguna otra forma de funciones 2D "básicas" y resolución lineal para encontrar los parámetros óptimos. Esta es una idea solo actualmente, no implementada / probada todavía.
Mi dominio de la experiencia en el procesamiento de señales es casi exclusivamente el procesamiento de imágenes, por lo que espero encontrar alternativas a este problema con el aporte de expertos activos en otras áreas del procesamiento de señales.
actualizar 18/08/2011
En base a las reacciones actuales, decidí aclarar un poco las cosas agregando gráficos de una entrada típica y los resultados de los 3 enfoques que describí originalmente + las sugerencias que recibí hasta ahora. Para facilitar la comparación, utilicé solo el filtrado 1D en estos ejemplos.
Los datos de entrada:
Filtro gaussiano + bájelo para cumplir con el requisito (1).
Puede ver que reducirlo da como resultado reducciones de luz innecesarias en el lado derecho.
Parabolas
En lo que a mí respecta, esto es bastante excelente, lamentablemente no se traduce perfectamente en 2D aplicando primero horizontal, luego vertical. En este caso, también puede ver que puedo evaluar las parábolas ajustadas en resolución de coma flotante, lo cual es un pequeño beneficio, pero no absolutamente obligatorio.
Erosión en escala de grises
Basado en la sugerencia de rwong, probé la erosión en escala de grises. Usé un elemento estructurante con la misma forma parabólica que mis parábolas "ajustadas". El resultado es casi exactamente el mismo, por lo que parece prometedor. Sin embargo, todavía hay algunos problemas: 1. Mi elemento estructurante no era "lo suficientemente grande" (aunque ya tenía 801 píxeles de ancho) 1. Solo tengo parábolas "hacia arriba", no hay "parábolas hacia abajo para suavizar la transición de una parábola a la siguiente
Filtrado medio
Solo incluido para completar, no es realmente lo que quiero.
datos en bruto
Pegué los datos de entrada en bruto + los diversos comandos de Python en pastebin, para que también pueda experimentar con los mismos datos.
http://pastebin.com/ASnJ9M0p