Problema de segmentación de imagen de diferentes materiales.


15

Hola CV / Comunidad de reconocimiento de patrones,

Tengo un problema serio con respecto a la segmentación de una imagen. El escenario es una atmósfera dentro de un horno que me vuelve loca. Y necesito detectar contornos de objetos de diferentes materiales (vidrio, cerámica, Al, Ir, ..) en un corto período de tiempo (<10 segundos) y no solo para un caso especial. También necesito el contorno en una fila secuencial de píxeles para el código. Por lo tanto, también se necesita un código de cadena o llamado seguimiento de borde / contorno, por lo que los agujeros abiertos no son buenos. En el fondo hay ruidos no lineales, aproximadamente de polvo, partículas o algo más, que aparecen de vez en cuando.

Las sugerencias de Matlab u OpenCV son bienvenidas.

Para hacerlo más claro, publiqué otra imagen de mi objetivo y un objeto semitransparente, que también necesita ser detectado. También otros ejemplos que deben ser conscientes. Ejemplo 1 ejemplo2 ejemplo3 ejemplo4

Como puede ver en la Imagen # 1, hay partículas en la parte derecha de la imagen y cerca del contorno exterior de la estrella, que es el objeto. Además, el contraste general no es muy bueno. El objeto en sí se encuentra en un subsuelo, lo que no es relevante para la detección del contorno. La imagen # 2 muestra un objeto medio transparente, que también es posible.

Quiero encontrar el contorno / perímetro de ese objeto, como en la siguiente pantalla (línea roja). Los dos rectángulos (amarillo) marcan el inicio (izquierda) y el punto final (derecha). La línea azul es ignorable. ejemplo2

Al principio pensé que podría resolver el problema de esa atmósfera sucia con solo filtros. Pero después de una cantidad honorable de tiempo de inversión, me acabo de dar cuenta de que tengo que eliminar o reducir los ruidos significativamente para aumentar el contraste de primer plano y fondo. Probé muchos métodos, como ecualización de histograma, ecualización adaptativa de Otsu, filtros lineales (p. Ej., Gauss), filtros no lineales (mediana, difusión), contornos activos, k-medias, fuzzy-c-medias y también Canny para puro Detección de bordes en combinación con operadores morfológicos.

  • Canny: Las partículas y la atmósfera están causando agujeros, pero necesito un contorno completo del objeto. Aún con el cierre, la dilatación de los operadores morfológicos no es lo suficientemente bueno. Canny todavía tiene los mejores resultados de todos los métodos que he estudiado debido a la histéresis.
  • Contornos activos: también funcionan en bordes / gradientes, actúan completamente locos después de inicializarse dentro del objeto, lo que tal vez sea causado por el mapa de bordes que resulta en el objeto 'abierto'. Hasta donde yo sé, el contorno tiene que estar cerrado. Probé con diferentes derivados (GVF / VFC / Classic Snake).
  • k-medias: los resultados incluyen la atmósfera del horno, debido al fondo brumoso. Lo mismo para fuzzy-c-means. Elegí dos grupos, debido a que separaba el objeto del fondo. Más grupos conducen a resultados más débiles.
  • Histograma / Otsu: debido a las intensidades grises muy cercanas (¡imho!), Está fusionando el objeto con el fondo. Probado con métodos locales y globales.
  • Filtros: especialmente GLPF u otro LPF están manchando los bordes, lo que no es tan bueno y ni siquiera reduce la atmósfera brumosa.
  • Los filtros no lineales preservan los bordes. La mayoría de ellos tardan demasiado en calcular las imágenes grandes. Tomó un filtro bilateral rápido por ahora. Los resultados se muestran a continuación.

Por lo tanto, ni un solo método es lo suficientemente bueno para los pasos de postprocesamiento, porque los resultados obtenidos del segmento de objeto compiten mal con un algoritmo existente. Ese algoritmo existente es muy local y, por lo tanto, funciona para este escenario muy especial.

Entonces, le pregunto si me he perdido algo por completo ... No tengo más idea de cómo procesar y cómo debería obtener buenos resultados de contorno, sin tener huecos o agujeros ... ¿Es posible sin hacer muchos cambios en el CCD y el entorno físico? ¡Gracias por adelantado!

Último enfoque hasta ahora (después de una larga noche de experimentos con MO):

  • Filtro bilateral (preservación de bordes, pero suaviza áreas homogéneas)
  • Canny (Sigma = 2, Umbral = [0.04 0.08])
  • Morfológica de Operaciones (MO): bwareopen, closing, removeybridge
  • bwlabelpara seleccionar solo el perímetro del contorno, lo que elimina los ruidos no deseados. Todavía no hay capturas de pantalla actualizadas, pero funciona para la estrella. el vidrio tiene un contorno interno que está conectado al contorno externo, que también se puede ver en la captura de pantalla a continuación.

Así que me temo que necesito un algoritmo especial para atravesar el contorno exterior. Será una búsqueda de vecindario en sentido horario / antihorario. Ese paso en sentido horario / antihorario puede cambiar, si hay un punto de esquina. Si hay un espacio, aumente el radio y vuelva a mirar. Si hay dos o más puntos de seguimiento posibles, tome el que obtuvo la misma dirección que el anterior. ¿Crees que el algoritmo de seguimiento de contornos tiene sentido?

Bordes de vidrio Estrella


¿Has probado el umbral adaptativo? No pareces mencionarlo. Creo que OTSU debería funcionar de alguna manera después de eliminar el ruido, pero tal vez el umbral adaptativo sea mejor.
Rui Marques

Hola Rui, probé el umbral adaptativo con esta extensión de Matlab: Umbral adaptativo. Aquí están los resultados para jugar con los parámetros de la ventana: 1.º intento 2.º intento 3.º intento Como puedes ver, con parámetros crecientes la parte media va de blanco a negro (qué es bueno, en mi humilde opinión) pero el resto del fondo también se vuelve negro, lo que es malo.
mchlfchr

3
¿Has probado algunas técnicas básicas de reducción de imagen? Como restar una corrección de campo plano para deshacerse de ese oscurecimiento en la esquina superior derecha ( en.wikipedia.org/wiki/Flat-field_correction ). Además, si las partículas son estáticas, se eliminarían instantáneamente. Entonces, puede utilizar cualquier método de detección de bordes que desee ...
PhilMacKay

Hola Phil, por lo que a mí respecta, y como sé, hay una serie de imágenes que se toman antes de que un objeto ingrese al horno. Por lo tanto, el tipo de calibración está aquí. Hablaré con el físico responsable del CCD y el medio ambiente el lunes. Pero gracias por el consejo, ¡lo intentaré!
mchlfchr

La segunda imagen que agregaste se ve totalmente diferente. ¿Puedes publicar todas las imágenes posibles?
Andrey Rubshtein

Respuestas:


2

Puedes probar lo siguiente:


Hola oli, con respecto a los métodos dispersos: ¿podría ser más específico de los métodos de ese código que debo usar? No estoy muy metido en esa sección y no encontré algo útil en los documentos sobre eliminación de ruido o desenfoque ... Gracias de antemano.
mchlfchr

1
Puede encontrar una versión "más fácil de usar", allí: lear.inrialpes.fr/people/mairal/denoise_ICCV09.tar.gz
oli

lamento quejarme en otro momento ;-) ... ¿también tienes fuentes win32? ¡gracias de nuevo!
mchlfchr

Tengo miedo de que no ...
oli

2

Creo que renunciaste a las técnicas de umbral demasiado pronto. Eche un vistazo a su histograma, es claramente trimodal: (eliminé las columnas blancas a la derecha de su imagen manualmente, supongo que no son parte de la imagen; tome esta imagen antes de ejecutar mi código)

ingrese la descripción de la imagen aquí

Eche un vistazo a todos los valores en el primer grupo:

ingrese la descripción de la imagen aquí

Para encontrar modos en el histograma trimodal, es posible utilizar la agrupación de medios K con K=3intensidad activa. El siguiente código de Matlab se encuentra th1=67en su código. La idea es asumir que tiene los 3 conjuntos y calcular el centroide ponderado en cada uno. Luego, cada nivel de intensidad se asigna a su propio grupo. Te detienes cuando los centroides ponderados dejan de moverse. Aquí está el resultado de encontrar dos umbrales en su imagen, que se muestran en el histograma.

ingrese la descripción de la imagen aquí

function [th1,th2]=SegmentHistTo3()
    im = imread('http://i.stack.imgur.com/U2sc5.png');
    h = imhist(im(:,:,1)); %# Calculate histogram

    th1new = round(256/3); %# Initial thresholds
    th2new = round(256*2/3);
    th1 = 0;
    th2 = 0;

    while (th1~=th1new) || (th2~=th2new) %# While the centroids keep on moving
        th1 = th1new;
        th2 = th2new;

        wa1 = WeightedAverage(h,1,th1);  %# Calculate 3 weighted averages
        wa2 = WeightedAverage(h,th1+1,th2);
        wa3 = WeightedAverage(h,th2,numel(h));

        th1new = round( (wa1+wa2)/2 );  %# The thresholds are middle points between the averages
        th2new = round( (wa2+wa3)/2 );
    end

    figure; hist( double( reshape(im(:,:,1),1,[]) ),256);
    hold on;
    plot( [th1 th1],[0 max(h)],'r','LineWidth',2);
    plot( [th2 th2],[0 max(h)],'r','LineWidth',2);

    figure;imshow( im(:,:,1)<th1);
end

function wa = WeightedAverage(region,th1,th2)    
    regionNonEmpty(th1:th2) = region(th1:th2);
    wa = sum( regionNonEmpty .* (1:numel(regionNonEmpty))) / sum(regionNonEmpty);    
end

Resolver el problema después es pan comido, simplemente haga algunas operaciones morfológicas simples, como abrir.


1
Hola Andrey, pero ¿cómo debo hacer una generalización de ese umbral que mencionaste? Tengo varios casos, no solo ese, y todavía necesito automatización. Y el Umbral de Otsu (función en matlab) no me dio buenos resultados. ¿Alguna pista más? Saludos cordiales
mchlfchr

Hola de nuevo, gracias hasta ahora, pero el código no funciona. Aparece la pantalla de figura en blanco. Lo probé con mis datos originales (mapas de bits) y el PNG que publicaste anteriormente. Estoy depurando su parte ...
mchlfchr

@mchlfchr, ¿tienes una caja de herramientas de procesamiento de imágenes? Si no lo hace, es posible cambiar imhistahist
Andrey Rubshtein

@mchlfchr, vea la versión actualizada
Andrey Rubshtein

Andrey, si inserto el archivo de mapa de bits original, los resultados son los que mencioné en mi publicación de origen. Tal vez esto está sucediendo con respecto a la resolución? La imagen de origen es 576x768 píxeles y escala de grises (256). Aquí están los resultados, si uso su función con mi imagen original: i.imgur.com/UXALJ.png histograma-figura de su función: i.imgur.com/7RiPP.png ¡ Gracias por su ayuda! saludos
mchlfchr

1

Como se sugirió anteriormente, el umbral puede ser muy efectivo en esta imagen, que es esencialmente binaria, excepto que un umbral constante no funcionará debido a una iluminación desigual. Necesita un umbral adaptativo.

Mi consejo sería hacer una reconstrucción de fondo con un modelo simple (posiblemente plano [3 DOF] o cuadrádico [6 DOF]), muestreando un pequeño número de valores en las regiones claras. Lo mejor es usar pequeños ROI para reducir el ruido. Luego corrija el sombreado restando (o dividiendo entre) los valores de fondo.

Si la interacción humana no es una opción, puede automatizar la búsqueda de áreas de fondo primero con Otsu directo y considerando un ROI uniforme (baja varianza) muy por debajo del umbral. Después de una primera reconstrucción de fondo, probablemente pueda mejorar aplicando este proceso a la imagen con corrección plana.

Todo el proceso puede implementarse para ejecutarse muy por debajo de un segundo.


Hola Yves, se prefiere un procesamiento automatizado. El aspecto DOF es interesante, pero no estoy seguro sobre el método Otsu, porque Otsu en sí no funciona bien. ¿Entiendo bien que desea elegir áreas aleatorias de la imagen y luego establecería un umbral después del valor medio sobre todas las áreas seleccionadas? Saludos cordiales
mchlfchr

1

Creo que la mejor manera es usar contornos activos. Si no sabe qué contornos activos hay, eche un vistazo a este video en youtube http://www.youtube.com/watch?v=ijNe7f3QVdA

Básicamente, necesita dar una segmentación de inicialización y mejorará la forma. Mi sugerencia es uno de los métodos discutidos en esta publicación y usar contornos activos como un segundo paso, es decir. como un paso de mejora

Aquí hay una implementación de contornos activos que puede usar http://www.mathworks.com/matlabcentral/fileexchange/19567


Bienvenido a dsp.se :) Gracias por contribuir, proporcionó una buena respuesta. Si quiere hacerlo aún mejor, creo que sería interesante proporcionar respuestas a algunas de estas preguntas: ¿Por qué cree que este es el mejor enfoque (por ejemplo, ¿tiene experiencia personal con la técnica)? ¿Cuál de los enfoques ya sugeridos cree que funcionaría bien en combinación con su sugerencia? Ofrezca una breve explicación de la técnica o, si tiene tiempo, intente proporcionar resultados experimentales utilizando la técnica en las imágenes de ejemplo proporcionadas. Y diviértete en dsp!
Penélope

@mkuse, como puede haber leído la publicación inicial, ya había probado los contornos activos, combinados con reducción de ruido y mapas de bordes. los resultados fueron malos y tuvieron un mal tiempo de ejecución para imágenes grandes.
mchlfchr

¿Qué tal si echas un vistazo a las técnicas de reducción de ruido? Puede encontrar un resumen de estos aquí: lnmiitdip.files.wordpress.com/2011/12/…
mkuse

1
@mkuse, ya mencioné la mecánica que ha publicado en su archivo PPT en mi publicación inicial. Edité mi publicación inicial, para que quede más claro, qué tipo de filtros he usado.
mchlfchr

0

Sabe claramente de qué se trata, pero no ha mencionado el uso de umbrales, en particular, ¿ha intentado aplicar un umbral global usando Otsu para calcular el nivel correcto, luego encontrar contornos y seleccionar el más grande?

[Editar para aclarar]

El umbral global obviamente no funcionará debido a la graident visible en la imagen.

Tuve un juego rápido con esto y descubrí que si divide la imagen en 6 partes (2 filas de 3 columnas del mismo tamaño), realiza un umbral usando Otsu en cada una y luego vuelve a armar, hace un trabajo bastante bueno para limpiar el imagen.

Todavía hay algunos artefactos menores en la parte superior derecha de la estrella.

Se me ocurre que, dado que el objeto tiene límites de línea recta, es posible que desee considerar una transformación de Hough para extraer estos bordes, intersecarlos para localizar vértices y usar el resultado como el contorno de su objeto.


Hola Dave, probé Otsu, pero trae el efecto de que el fondo superior derecho se está fusionando con el objeto, lo cual es absolutamente inaceptable.
mchlfchr

Hola Dave, Hough no es una opción, debido a los requisitos de tiempo de ejecución y, por lo que sé, es mucho tiempo para imágenes grandes.
mchlfchr

0

¿Los contornos son siempre líneas rectas o curvas conocidas?

Si es así, en lugar de tratar de obtener cada píxel a lo largo del borde correcto, usaría transformadas de Hough para obtener las ecuaciones de las líneas y luego recrear los contornos de las líneas y sus secciones


1
Como ya mencioné: necesito enfoques cercanos en tiempo real. Y hasta donde sé el HT, lleva mucho tiempo. Otro aspecto es que no conozco las curvas y las líneas no siempre son rectas. El contorno depende del material, que está en el horno (para más información, vea mi publicación de origen).
mchlfchr

Para las líneas rectas es bastante rápido, y si sabe aproximadamente dónde están las líneas (por ejemplo, de un cuadro anterior) puede buscar solo ese espacio de parámetros
Martin Beckett
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.