¿Cómo puedo filtrar el paso bajo solo reduciendo los datos pico?

16

Tengo una imagen 2D, que quiero filtrar paso bajo, con estas restricciones / métricas de calidad:

  1. 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.
  2. La frecuencia de corte de paso bajo debe ser un parámetro para experimentar con
  3. La aplicación de este filtro repetidamente no debería cambiar el resultado de manera significativa.
  4. El tiempo que lleva ejecutar este algoritmo (5 minutos para una imagen de 5MPix parece razonable)
  5. Minimizando la cantidad de luz que se filtra.

A continuación se presentan algunos enfoques que he probado, junto con sus defectos:

  1. 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.

  2. 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.

  3. 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: 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. filtrado gaussiano

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. montaje de parábola

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 erosión en escala de grises

Filtrado medio
Solo incluido para completar, no es realmente lo que quiero. filtro mediano

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

Pieter-Jan Busschaert
fuente
1
¿Puedes explicar un poco más sobre las restricciones 1 y 5? Parecen ser (a primera vista) contradictorios.
Peter K.
Probablemente estoy malinterpretando lo que quiere decir con "este algoritmo", pero 5 minutos para 5 MP parecen ser mucho para aplicar un filtro de paso bajo.
bjoernz

Respuestas:

8

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

rwong
fuente
Hola, gracias por el puntero al filtro morfológico en escala de grises. La descripción en wikipedia parece interesante y lo investigaré. Sin embargo, en su enlace a la documentación de OpenCV, solo veo filtros morfológicos normales, no en escala de grises. Definitivamente comprobaré esta opción y le haré saber los resultados. Gracias.
Pieter-Jan Busschaert
66
¿Ayuda la sugerencia de rwong de filtrado medio? Explicar un poco más sobre lo que está tratando de lograr presentando un ejemplo simple de los datos y un ejemplo "falso" de lo que desea obtener podría ayudar.
Peter K.
Actualicé mi pregunta con datos de muestra + resultados de varias sugerencias. Espero que las cosas estén más claras ahora.
Pieter-Jan Busschaert
2

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:

%# - get inputlist from pastebin

%# - smoothen data. Lower factor means less smooth
smoothingFactor = 1000;
smoothData = smoothn(inputlist,smoothingFactor);

%# - shift down
smoothData = smoothData - max(inputlist-smoothData);

%# - show results
plot(inputlist,'b'),hold on,plot(smoothData,'r')

ingrese la descripción de la imagen aquí

Jonas
fuente
Gracias por su sugerencia, lo investigaré. Según su gráfico, parecería que necesito un factor de suavizado mucho mayor que su ejemplo. El borde empinado alrededor de x = 700 no se elimina y será claramente visible. Además, la protuberancia inicial en x = [0, 400] no se elimina en absoluto. ¿No crees que esto tendrá el mismo problema que cualquier otro enfoque (filtro de paso bajo + movimiento hacia abajo)? Puede ver el desplazamiento global entre los dos gráficos, que probablemente aumentará incluso cuando use un factor de suavizado más alto.
Pieter-Jan Busschaert
@ Pieter-JanBusschaert: Oh, pensé que el primer pico fue de alguna manera útil para ti. De todos modos, todo el filtro de paso bajo + movimiento hacia abajo tendrá dificultades con el fuerte aumento de ~ 650: harán que esta parte sea más plana, y por lo tanto, la curva debe moverse mucho hacia abajo. La mediana del filtro seguido de una spline suave ayuda un poco.
Jonas