Bordes de conexión detectados por un detector de bordes

14

Tengo una imagen binaria obtenida de un detector de borde astuto. Los bordes no se detectan bien en el centro y necesito unirlos. La conexión de los bordes depende de la orientación y del vecindario. Necesito conectar los vértices si están por debajo de un umbral (digamos menos de 5 píxeles de distancia). Si mis características casi lineales están bien orientadas, este umbral debería ser relajado. (Este es el mejor caso). imagen

Intenté la transformación Hough, pero no funcionó porque no tengo líneas rectas. La dilatación y la erosión tampoco son buenas; hacen que las imágenes sean más desordenadas.

El enfoque que estoy tratando es detectar primero los vértices y los nodos (en MATLAB con bwmorph) y luego hacer las hojas como una característica separada. Esto se hace de la siguiente manera:

  1. Escaneando en una ventana de 3x3, busca vecinos.
  2. Atraviesa el objeto conectado completo.
  3. Intenta ajustar una línea (o tal vez un polinomio cuadrático).
  4. Verifique característica por característica si vale la pena una conexión o no.

La implementación no es sencilla, ya que la parte de toma de decisiones donde los vértices necesitan conectarse es complicada.

Naresh
fuente
Encontré una solución interesante para encontrar las ramas. MATLAB puede proporcionar fácilmente la ubicación de los nodos. MATLAB también puede etiquetar características conectadas. Para que pueda elegir una función conectada. Encuentra nodos. Establezca estos nodos en 0. Básicamente desconecte la función y etiquételos nuevamente. Tendrás ramas en los árboles. Esto requirió menos programación manual y los resultados parecen estar bien. Alguna entrada?
Naresh
Para la parte de conexión, ahora estoy pensando en encontrar funciones grandes y considerarlas más confiables. Luego, si son líneas rectas (verifique la calidad de la condición física), conviértalas en coordenadas polares y busque vecindad como una transformación de hough. Para funciones grandes, el radio de búsqueda es grande (proporcional al tamaño). Estoy implementando este código. Resultados en camino. Comentarios por favor.
Naresh

Respuestas:

4

Puede que esta no sea una solución completa, pero le dará una buena dirección.

Básicamente, ¿cuál es el criterio clave para decir que los bordes coinciden? Que "localmente" el gradiente del borde coincide y, en cierta medida, las distancias son razonables en función de cuánto tiempo el borde es continuo.

Si tiene bordes geométricos, como líneas rectas largas, Hough hará un trabajo sin interrupciones de inmediato. Pero esto no funciona cuando los bordes son curvas arbitrarias. En este caso, aún puede pensar en la curva como segmentos constantes más o menos en piezas (lo suficientemente bueno en su caso), por lo tanto, debe tomar Hough localmente. es decir, puede tomar una pequeña porción de imagen (digamos un bloque), calcular el Hough e identificar algunos picos. En base a esto, puede identificar que el deshuesado está creando una brecha significativa, de ser así, consérvelo o continúe.

Una vez que se llenan los espacios más pequeños, puede extenderlos para ocupar un tamaño más grande. los picos serán más, pero puede seleccionar menos.

Dipan Mehta
fuente
gracias Dipan, yo también pensé en eso. Será una operación costosa pero puedo extraer algo de información. Pero a veces la transfomación de Hoguh tampoco me da líneas conectadas. Hough solo se ocupa de líneas rectas perfectas. Y no le importa la conectividad de los píxeles. Simplemente ajusta una línea a 3 o más píxeles aleatorios en una línea recta. Estoy codificando mi hipótesis. Publicaré los resultados aquí para mayor discusión. Naresh
Naresh
θ
4

De hecho, eso no será sencillo ... Podrías intentar trabajar completamente con una estructura Graph. Primero extraiga todos los píxeles conectados de la imagen e insértelos en un Gráfico donde los nodos vecinos estén conectados con un borde. Puede descartar Gráficos que son más pequeños que un número M de nodos (para excluir pequeños puntos que no son relevantes para la imagen).

Al final de este proceso, tendrá un conjunto de gráficos desconectados. (A juzgar por su imagen, estos no son exactamente árboles porque hay ciclos allí)

Puede encontrar los puntos extremos de cada gráfico (los píxeles extremos en la periferia de cada gráfico) comenzando desde un nodo aleatorio y haciendo un DFS .

Al final de este proceso, tendrá un conjunto de coordenadas de píxeles para cada Gráfico correspondiente a los puntos extremos donde es más probable que se formen conexiones.

Ahora puede intentar conectar los vecinos extremos más cercanos (con una distancia <= 5) simplemente con una línea recta.

Pero, si desea tener en cuenta la pendiente del segmento de línea que conduce a ese píxel extremo, puede intentar "ajustar una línea" a N píxeles ANTES de alcanzar ese píxel extremo. Entonces, si N = 5, los últimos 5 píxeles de una rama se usarían para estimar una línea.

Por lo tanto, para cada par de vecinos más cercanos ahora también tiene otra cosa que usar como criterio para juzgar si se deben conectar dos segmentos (es decir, Distancia de punto extremo <= 5 píxeles Y pendiente de línea aproximadamente igual).

Para minimizar el impacto del ruido que puede hacer que sus líneas aparezcan irregulares cerca de las puntas de las ramas (y, por lo tanto, distorsionar su estimación de pendiente), puede intentar aplicar un paso de simplificación a su Gráfico (este es otro punto (además del DFS anterior) en el que vale la pena trabajar con una estructura gráfica). Podría, por ejemplo, eliminar los nodos posteriores del Gráfico que harían que la línea se "doblara" en ángulos mayores que algunos límites (para algo más complejo, consulte aquí ). De esta manera, ajustará líneas "más simples", aproximadamente en la dirección de una parte más grande del segmento formado por los píxeles de la imagen.

Eso probablemente dará como resultado conexiones decentes para la mayoría de los casos (a juzgar por la imagen que ha publicado), pero aún lo dejaría con algunos desafiantes. Por ejemplo, ¿cómo se conectaría un patrón interrumpido en forma de "Y" en el que una de las ramas se interrumpe cerca del punto de conexión? (es decir, tiene un doblez "continuo" que debe estar conectado con un segmento de línea que se "combina" con él). Quizás podría revisar qué tan comunes son estos casos y revisar sus criterios de conexión más adelante.

Además, quizás valga la pena examinar cómo podría mejorar la adquisición de su imagen (por ejemplo, aumentar la resolución).

AUTOMÓVIL CLUB BRITÁNICO
fuente
Gracias por una buena respuesta. Sí, tu observación es correcta. No es un árbol, así que es mejor hacer un gráfico. Esto me ayudará a encontrar ciclos también. La cosa es que MATLAB implementó el gráfico en la caja de herramientas de bioinfo, que no puedo asumir que la mayoría de la gente tendrá. Lo máximo que puedo hacer es la caja de herramientas de procesamiento de imágenes. Douglas-peucker también es algo que consideré. Pero después de consultar a un experto en SIG, me di cuenta de que podría hacer las cosas más complejas y podría obtener líneas de intersección. Además, también necesito mirar diferentes segmentos de líneas en un gráfico, ya que necesito 10 píxeles para hacer una línea, y es posible que ya tenga una bifurcación.
Naresh