una - reconocimiento de colores rgb matlab
¿Cómo detectar curvas en una imagen binaria? (5)
Tengo una imagen binaria, quiero detectar / rastrear curvas en esa imagen. No sé nada (coordenadas, ángulo, etc.) ¿Alguien me puede guiar, cómo debería comenzar? supongamos que tengo esta imagen
Quiero separar las curvas y otras líneas. Solo me interesan las líneas curvas y sus parámetros. Quiero almacenar información de curvas (en matriz) para usar después.
Como parece que ya tiene una buena imagen binaria, podría ser más fácil separar los diferentes componentes conectados de la imagen y luego calcular sus parámetros.
En primer lugar, puede hacer la separación escaneando a través de la imagen, y cuando se encuentra con un píxel negro, puede aplicar un algoritmo estándar de inundación para averiguar todos los píxeles en su forma. Si tiene la caja de herramientas de imágenes de matlab, puede encontrar los procedimientos de uso de bwconncomp y bwselect para esto. Si sus formas no están completamente conectadas, puede aplicar una operación de cierre morfológico a su imagen para conectar las formas.
Después de haber segmentado las diferentes formas, puede filtrar las curvas comprobando cuánto se desvían de una línea. Puede hacer esto simplemente seleccionando los puntos finales de la curva y calculando qué tan lejos están los otros puntos de la línea definida por los puntos finales. Si este valor excede un máximo, tiene una curva en lugar de una línea.
Otro enfoque sería medir la relación de la distancia de los puntos finales y la longitud del objeto. Esta relación sería cerca de 1 para líneas y más grande para curvas y formas onduladas.
Si sus imágenes tienen ángulos, que desea separar de las curvas, puede inspeccionar el gradiente direccional de sus curvas. Segmente la forma, elija un conjunto de puntos equidistantes y, para cada punto, calcule el ángulo con el punto anterior y con el punto siguiente. Si la diferencia del ángulo es demasiado alta, no tiene una curva suave, sino una forma en ángulo.
Las posibles dificultades en la implementación incluyen líneas gruesas, que puede resolver mediante la transformación del esqueleto. Para la implementación de matlab de los extremos del esqueleto y la curva de búsqueda, ver la documentación del kit de herramientas de procesamiento de imágenes de matlab
1) Lee un libro sobre Análisis de imágenes
2) Busque un píxel negro, cuando lo encuentre, busque píxeles vecinos que también sean negros, almacene su ubicación y luego vuélvalos blancos. Esto obtiene los puntos en un objeto y lo elimina de la imagen. Solo sigue repitiendo esto hasta que no queden píxeles negros.
Si desea separar las curvas de las líneas rectas, intente ajustar la línea y luego obtenga el coeficiente de correlación. Algoritmos similares están disponibles para las curvas y la correlación le dice la cercanía del punto a la forma idealizada.
No soy un experto en visión artificial, pero creo que es posible detectar líneas / curvas en imágenes binarias de forma relativamente fácil utilizando algunos algoritmos básicos de detección de bordes (por ejemplo, filtro Sobel).
Realmente depende de lo que quieres decir con "curva".
Si quiere simplemente identificar cada colección discreta de píxeles como una "curva", puede usar un algoritmo de componentes conectados . Cada componente correspondería a una colección de píxeles. A continuación, puede aplicar alguna prueba para determinar la linealidad o alguna otra característica del componente.
Si busca líneas rectas, curvas circulares o cualquier otra curva paramétrica, puede usar la transformada Hough para detectar los elementos de la imagen.
El mejor enfoque dependerá realmente de qué curvas esté buscando y qué información necesita sobre las curvas.
enlaces de referencia:
También hay otra solución posible con el uso de códigos de cadena. Comprender los códigos de cadena de Freeman para OCR
El código de cadena asigna básicamente un valor entre 1-8 (o 0 a 7) para cada píxel, que indica en qué ubicación de píxel, en un vecindario conectado 8, se encuentra el predecesor conectado. Así, como se menciona en las sugerencias de Hackworths, uno realiza el etiquetado de componentes conectados y luego calcula los códigos de cadena para cada curva componente. Mire la distribución y el gradiente de los códigos de cadena, uno puede distinguir fácilmente entre líneas y curvas. Sin embargo, el problema con el método es cuando tenemos curvas de oscialización, en cuyo caso el gradiente es menos útil y ¡uno depende del agrupamiento de los códigos de cadena!