Biblioteca para reconocer las áreas de color(u)rojas de una imagen

Quiero codificar una aplicación para generar un mapa de imagen .

Escaneará una imagen y declarará áreas contiguas del mismo color como partes de la misma área de mapa de imagen.

Me imagino diciendo que el negro se usa para los bordes, para delinear áreas, y el azul marino se usa para el texto, por lo que debe ignorarse. Imagine un mapa de los EE. UU., con los estados delineados en negro con los nombres de los estados en azul marino y los estados coloreados en negro o azul marino.

¿Conoces alguna biblioteca que pueda ayudar con eso? Prefiero C/C++ o Python o Delphi, pero aceptaré cualquier idioma, solo para ver cómo se hace

Respuestas (2)

Quizá si volvemos a su pregunta anterior : tiene un plano de planta coloreado, que ha convertido en un mapa de imagen, y ahora quiere saber en qué habitación está el cursor. En lugar de molestarse con el mapa de imagen intermedio, ¿por qué no? simplemente use javascript para determinar el color del píxel debajo del cursor en cualquier momento? Luego buscaría este valor rgb en una lista de colores de la habitación.

Como usted elige los colores del plano de planta, puede garantizar un color diferente para cada habitación. Si es necesario, las habitaciones del mismo color aparente pueden tener ligeras diferencias de rgb que apenas se notarán. Si el píxel debajo del cursor es texto negro, puede probar con algunos píxeles a cada lado.

¡Una idea excelente! PERO , quiero que los clientes dibujen el plano de planta, lo que dificulta restringir la selección de colores. Sin embargo, puedo verificar, como usted dice, "ligeras diferencias de rgb", y rechazarlas, cuando analizo la imagen por primera vez.
Estoy muy tentado por esta solución, ya que parece muy simple. Sin embargo, no estoy seguro de qué tan bien funcionará con muchas habitaciones: piense en un gran centro comercial, una fábrica, un hotel o un bloque de oficinas. Creo que la diferencia podría ser visible para el ojo humano.
Puede usar 2 imágenes, una que presenta al usuario y una segunda en la que realiza la búsqueda de color. (Deberá tener un lienzo separado en javascript en cualquier caso). Puede procesar manualmente esta segunda imagen rellenando cada área con un color único, al mismo tiempo que crea el mapeo de color para la identificación del área.
¿Quiere decir que tengo una segunda imagen, pero no la muestro? Luego, cuando el usuario hace clic en la imagen mostrada en X, Y, ¿puedo solicitar context.getImageData(X,Y, ...)la segunda imagen?
Sí. Tal vez podría hacer que sus clientes comiencen con la segunda imagen como base, luego agreguen sus anotaciones y colores "más bonitos" para producir la primera imagen.

Si está dispuesto a aceptar rectángulos simples, en lugar de polígonos complejos, en su mapa de imágenes, una posible ruta de investigación es usar ImageMagick para determinar el tamaño y la ubicación de un área coloreada. Por ejemplo, usando la imagen en su pregunta anterior y seleccionando el color de la habitación de la izquierda como valor hexadecimal rgb e97978, puede ejecutar

convert https://i.stack.imgur.com/fp5Ff.jpg -fill white +opaque '#e97978'  /tmp/out.png

para obtener solo esa habitación coloreada sobre un fondo blanco:habitación

Si agrega la -trimopción al final, obtiene la imagen recortada:

habitación recortada

que es el cuadro delimitador de la habitación, pero si lo usa identifyen la imagen resultante, no solo tiene el tamaño de este cuadro (196x179), sino también su posición superior izquierda (+111+53) en la imagen original más grande:

$ identify /tmp/out.png
/tmp/out.png PNG 196x179 900x291+111+53  ...

Entonces, si puede colorear cada habitación de manera diferente, y preferiblemente no usar jpg con pérdida que difumina los colores, podría estar más cerca de un algoritmo automatizado.

Me gusta este 9 y lo voté), pero debe haber soporte para polígonos :-(
Canny Edge Detection también se ve muy interesante