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.
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.
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
,remove
ybridge
bwlabel
para 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?
fuente
Respuestas:
Puedes probar lo siguiente:
Segmentación de imagen eficiente basada en gráficos: http://www.cs.brown.edu/~pff/segment/ (código disponible)
Segmentación basada en GraphCut: http://www.csd.uwo.ca/~olga/OldCode.html (código disponible)
Cambie la imagen de la imagen primero usando métodos dispersos: http://spams-devel.gforge.inria.fr/ (código disponible)
fuente
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)
Eche un vistazo a todos los valores en el primer grupo:
Para encontrar modos en el histograma trimodal, es posible utilizar la agrupación de medios K con
K=3
intensidad activa. El siguiente código de Matlab se encuentrath1=67
en 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.Resolver el problema después es pan comido, simplemente haga algunas operaciones morfológicas simples, como abrir.
fuente
imhist
ahist
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.
fuente
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
fuente
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.
fuente
¿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
fuente