¿Cómo detecto objetos distintos cuando sus bordes se tocan?

21

Necesito encontrar todos los contornos en una imagen recuperada de la cámara. Así que primero uso el detector de bordes astutos para encontrar los bordes y luego encontrar los contornos. Bastante simple.

Sin embargo, mis contornos se "fusionan". Por ejemplo, en la imagen a continuación, claramente tengo 4 objetos diferentes. Sin embargo, los bordes se tocan ligeramente en algunos puntos, por lo que obtengo un gran contorno en lugar de cuatro separados. Traté de cambiar alrededor de los umbrales, erosión, operaciones de morfología y cosas similares, pero los bordes se siguen tocando ligeramente. ¿Alguien tiene alguna sugerencia sobre cómo obtener contornos separados en imágenes similares a la de abajo? (La imagen a continuación es obviamente solo un ejemplo, mis imágenes reales son mucho más complejas, pero tienen el mismo problema básico).

ingrese la descripción de la imagen aquí

Lorem Ipsum
fuente
La segmentación de cuencas puede funcionar.
sm176357
Por lo tanto, también debe considerar los casos en los que el contacto es una línea y no solo un punto (tocar pero no superponerse)
Shravya Boggarapu

Respuestas:

11

Detectando diferentes componentes:

Si está tratando de detectar los diferentes componentes, probablemente haya otros enfoques para hacerlos que no sean detectar los contornos. Aquí hay un ejemplo en Mathematica. Se utiliza una erosión seguida de dilatación para cerrar la brecha en el segundo componente antes de la detección (si no hace esto, no lo detectará).

img = Binarize@Import["http://i.stack.imgur.com/yqDyu.png"];
Colorize[MorphologicalComponents[Dilation[Erosion[img,1],1]]]

La figura a la izquierda a continuación, muestra la detección de objetos imperfectos (sin cerrar el espacio) y a la derecha, muestra la detección correcta (ejecutando el código anterior).

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

Detectando los diferentes contornos:

Sin embargo, si realmente desea separar solo los contornos, aquí hay un ejemplo. La erosión y la dilatación se realizan como antes para cerrar la brecha y la imagen resultante se ejecuta a través de un detector de bordes Canny. He hecho explícitas las opciones predeterminadas, para que pueda ver lo que se está utilizando.

img2 = EdgeDetect[Dilation[Erosion[img, 1], 1], Method -> "Canny"]

Esto le dará tanto el borde interior como el exterior (vea la figura a la izquierda a continuación), ya que el ancho del píxel es mayor que 1 en todos lados. No he tenido mucha suerte tratando de hacerlo más delgado, ya que el rendimiento se degrada (puede ser diferente para sus otras imágenes). Los contornos internos son los que desea, y el contorno exterior es solo el contorno combinado de los 4 componentes. Ahora todo lo que tenemos que hacer es soltar el más externo con:

SelectComponents[img2, "EnclosingComponentCount", # > 0 &]

que te da solo los contornos internos (ver abajo a la derecha). En otras palabras, solo selecciona aquellos contornos que están encerrados por al menos otro contorno, lo que descalifica automáticamente el más externo. No sé el equivalente de estos comandos / operaciones en openCV.

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

Tenga en cuenta que los saltos aparentes en la figura se deben a guardar en JPEG en un tamaño menor. No se ve así en mi pantalla.

Lorem Ipsum
fuente
2

Intente preprocesar sus imágenes con un filtro morfológico como la erosión . Esto permitirá separar contornos conmovedores. Después de detectar sus contornos, puede aplicar una operación de dilatación para completar las redes.


fuente
Lo intenté, pero los resultados no mostraron mejoría.
1
¿Puedes mostrar una imagen de ejemplo real?
2

No es una respuesta a su pregunta, pero el análisis de contorno es propenso a errores. No puede hacer mucho al respecto y funciona solo en escenarios muy simples.

Si tiene problemas para usarlo, debe buscar un algoritmo completamente diferente. Hay formas más complejas y más robustas de resolver cosas, pero depende de lo que desee lograr (detección de objetos, seguimiento, etc.)


fuente
Gracias. Mi programa se usa para la detección de manos, por lo que creo que sería muy similar a la detección de objetos. ¿Dio alguna sugerencia para algoritmos más complejos y robustos? Las características de Haar, SURF y algoritmos de aprendizaje automático similares no son algo que pueda hacer.
¿Viste estos recursos? paginas.fe.up.pt/~hgc2011 Son principalmente bases de datos / resultados, pero espero que puedan encontrar algunos buenos documentos aquí.
0

Los contornos no son necesariamente abiertos, considere que ha utilizado canny para detectarlos. Los problemas con Canny ya fueron discutidos aquí . La discusión sobre canny le da la idea básica de que todavía hay operaciones como el cierre y la dilatación que se requieren además de canny para evaluar los contornos cerrados.

Esto también depende de si estamos buscando contornos o segmentaciones (Canny versus métodos como Graphcuts ). Supongo que buscar una solución robusta depende de su aplicación final.

beedot
fuente