2010-02-17 16 views
5

Implementé algunos métodos de binarización adaptativa, usan una ventana pequeña y en cada píxel se calcula el valor de umbral. Hay problemas con estos métodos: Si seleccionamos el tamaño de la ventana demasiado pequeña vamos a conseguir este efecto (Creo que la razón es debido al tamaño de la ventana es pequeña) alt text http://i.piccy.info/i4/3d/bc/773b7df74ff7dadfd11c09372b7e.jpegUmbral de adaptación Los efectos nocivos de la binarización

En la esquina superior izquierda hay una imagen original , esquina superior derecha - resultado de umbral global. Abajo a la izquierda - ejemplo de dividir la imagen en algunas partes (pero estoy hablando de analizar el entorno pequeño de píxeles de la imagen, por ejemplo, ventana de tamaño 10X10). Para que pueda ver el resultado de dichos algoritmos en la imagen inferior derecha, tenemos un área negra, pero debe ser blanca. ¿Alguien sabe cómo mejorar un algoritmo para resolver este problema?

Respuesta

2

Hay mucha investigación pasando en esta área, pero desafortunadamente no tengo buenos enlaces para dar.

Una idea, que podría funcionar pero no lo he probado, es intentar estimar las variaciones de iluminación y luego eliminar eso antes del umbral (que es un término mejor que "binarización"). El problema se mueve desde el umbral adaptativo hasta encontrar un buen modelo de iluminación.

Si sabes algo sobre las fuentes de luz, entonces por supuesto podrías construir un modelo a partir de eso.

De lo contrario, un truco rápido que podría funcionar es aplicar un filtro de paso bajo muy pesado a su imagen (desenfocarlo) y luego usarlo como su modelo de iluminación. Luego, cree una imagen de diferencia entre la versión original y la borrosa, y limítelo a eso.

EDIT: Después de las pruebas rápidas, parece que mi "truco rápido" realmente no va a funcionar en absoluto. Después de pensar en ello no sorprende mucho, ya sea :)

I = someImage 
Ib = blur(I, 'a lot!') 
Idiff = I - Idiff 
It = threshold(Idiff, 'some global threshold') 

EDIT 2 consiguió otra idea que podría funcionar dependiendo de cómo se generan las imágenes. Trate de estimar el modelo de iluminación de las primeras filas en la imagen:

  1. dar los primeros N filas en la imagen
  2. Crear una fila media de la N recogido filas. Usted sabe que tiene una fila como modelo de fondo.
  3. Para cada fila en la imagen, reste la fila del modelo de fondo (la fila media).
  4. Umbral de la imagen resultante.

Lamentablemente estoy en mi casa sin ninguna buena herramienta para probar esto.

+0

¿Puede explicarlo con más detalle? ¿Qué se entiende por "eliminar eso antes del umbraling"? ¿Cómo eliminar? Luego, una cosa más: Difuminar mucho y tomar la diferencia y luego umbralizar con umbral global: ¿qué efecto producirá para obtener buenas imágenes? Me refiero a las imágenes que no se dañaron después del método de umbral adaptativo? – maximus

+0

Ver la actualización: No creo que mi método pueda funcionar alguna vez. Creo que tendrías que recurrir a algún método más avanzado. –

+0

De todos modos, ¡Gracias por tu respuesta! ¡Espero que aquí haya más respuestas! – maximus

2

Parece que está haciendo un umbral de adaptación incorrecto. Sus imágenes se ven como si dividiera su imagen en bloques pequeños, calculó un umbral para cada bloque y aplicó ese umbral a todo el bloque. Eso explicaría los artefactos de "caja". Normalmente, el umbral adaptativo significa encontrar un umbral para cada píxel por separado, con una ventana separada centrada alrededor del píxel.

Otra sugerencia sería construir un modelo global para su iluminación: en su imagen de muestra, estoy bastante seguro de que podría caber un avión (en X/Y/espacio de brillo) a la imagen usando mínimos cuadrados, luego separe los píxeles en píxeles más brillantes (primer plano) y más oscuros que ese plano (fondo). A continuación, puede ajustar los planos por separado a los píxeles de fondo y primer plano, usando nuevamente el promedio entre estos planos y mejorar la segmentación de forma iterativa. Lo bien que funcionaría en la práctica depende de qué tan bien se pueda modelar su rayo con un modelo lineal.

Si los objetos reales que intentas segmentar son "más delgados" (dijiste algo sobre los códigos de barras en un comentario), podrías intentar una operación de apertura/cierre simple para obtener un modelo de iluminación. (es decir, cierre la imagen para eliminar los píxeles de primer plano, luego use [imagen cerrada + X] como umbral).

O bien, podría intentar el filtro de cambio medio para obtener los píxeles de fondo y primer plano con el mismo brillo. (Personalmente, lo probaría primero)

1

Tiene una iluminación muy poco uniforme y un objeto bastante grande (por lo tanto, no es una forma universal fácil de extraer el fondo y corregir la falta de uniformidad). Esto básicamente significa que no puede usar el umbral global, necesita umbralización adaptativa.

Quiere probar la binarización de Niblack. El código de Matlab está disponible aquí http://www.uio.no/studier/emner/matnat/ifi/INF3300/h06/undervisningsmateriale/week-36-2006-solution.pdf (página 4). Hay dos parámetros que deberá sintonizar a mano: el tamaño de la ventana (N en el código anterior) y el peso.

1

intenta aplicar un umbral adaptativo local utilizando este procedimiento:

  1. convolución de la imagen con una media o mediana de filtro
  2. restar la imagen original de la que umbral de convolución
  3. la imagen de diferencia

El método de umbral de adaptación local selecciona un umbral individual para cada píxel.

Estoy usando este enfoque ampliamente y está funcionando bien con imágenes que no tienen un fondo uniforme.

Cuestiones relacionadas