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
fuente
Respuestas:
De hecho, hay una versión 2D para su intento # 2: es similar en teoría, pero no se puede descomponer en dos operaciones 1D. Lea sobre "Filtrado morfológico en escala de grises 2D". Es más rápido que el ajuste de la curva.
El filtrado medio también puede ser útil si está tratando de eliminar manchas. Una forma más avanzada de filtrado medio es el "filtrado ordinal".
En todos los casos, el requisito n. ° 1 se puede cumplir trivialmente tomando el mínimo en píxeles entre la salida y la entrada. Es un criterio de calidad importante, pero no limitará la elección de algoritmos.
El filtrado gaussiano (y una serie de otros filtros útiles) se pueden descomponer (primero de operaciones 2D a 1D, luego a través de la transformación de Fourier), pero hay muchas otras técnicas útiles de procesamiento de imágenes que no son descomponibles, lo que las hace lentas pero no disminuye su utilidad
fuente
Sugiero usar una spline de suavizado.
A continuación, le mostramos cómo puede hacer esto usando Matlab con la robusta función de suavizado de splines SMOOTHN del Intercambio de archivos de Matlab (que contiene el código fuente completo, para que pueda volver a implementarlo en otro lugar si es necesario). Tenga en cuenta que también funciona con datos n-dimensionales:
fuente