¿Cómo reconocer rectángulos en esta imagen?


Tengo una imagen con líneas horizontales y verticales. De hecho, esta imagen es el sitio web de la BBC convertido a líneas horizontales y verticales. Mi problema es que quiero poder encontrar todos los rectángulos en la imagen. Quiero escribir un programa de computadora para encontrar todos los rectángulos. ¿Alguien sabe cómo hacer esto o sugerir ideas sobre cómo empezar? Esta tarea es fácil para mí como persona para encontrar los rectángulos visuales, pero no estoy seguro de cómo describirlo como un programa.

La imagen es la Sitio web de la BBC aquí http://www.bbc.co.uk /


Actualización a esto, escribí el código que convierte la imagen del sitio web de la BBC a la línea horizontal y vertical, el problema es que estas líneas no se encuentran completamente en las esquinas y, a veces, no forman completamente un rectángulo. ¡Gracias!

Author: casperOne, 2009-11-30

9 answers

Opencv (image processing and computer vision library written in c) tiene implementación para la transformación de hough (la transformación de hough simple encuentra líneas en una imagen, mientras que la generalizada encuentra objetos más complejos) por lo que podría ser un buen comienzo. Para los rectángulos que tienen esquinas cerradas también hay detectores de esquinas como cornerHarris que pueden ayudar.

Ejecuté la demostración de houghlines proporcionada con opencv y aquí está el resultado de la imagen que dio (líneas detectadas marcado en rojo): texto alternativo http://imageapp.splintec.com/images/Screenshot2.png

 20
Author: elijah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-22 23:08:17

Creo que está buscando la transformada de Hough generalizada.

 8
Author: rlbond,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-30 02:23:19

En la visión artificial hay un algoritmo llamado Generalizado Hough Transform que tal vez puede resolver su problema. Debería haber código abierto habiendo implementado este algoritmo. Sólo búscalo.

 4
Author: ppan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-30 07:24:23

Suponiendo que es una imagen razonablemente libre de ruido (no un video de una pantalla), entonces uno de los algoritmos simples de relleno debería funcionar. Es posible que deba ejecutar una dilatación/erosión en la imagen para cerrar los huecos.

La forma normal de encontrar líneas es una transformación de Hough (luego buscar líneas en ángulos rectos) Opencv es la forma más fácil.

Echa un vistazo a esta pregunta Detección de Objetos OpenCV-Punto Central

 3
Author: Martin Beckett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:00

Hay varios enfoques diferentes para su problema. Usaría una herramienta de procesamiento morfológico de imágenes como esta. Usted tendrá la flexibilidad de definir "rectángulo" incluso algo que no "exactamente cerrado" (donde el algoritmo de relleno fallará).

Otra posibilidad podría ser usar un enfoque de aprendizaje automático, que básicamente está más basado en datos que en definiciones como el anterior. Tendrás que darle a tu algoritmo varios " ejemplos" de lo que es un rectángulo, y eventualmente aprenderá (con un sesgo y una tasa de error).

 2
Author: Davide,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-30 02:07:47

Itere de izquierda a derecha hasta que llegue a un píxel de color y luego use el algoritmo de relleno de inundación modificado. más información sobre el algo flood fill @ wiki

 1
Author: data,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-30 01:31:20

Otro enfoque sería encontrar CUALQUIER píxel de color en la imagen y luego ir con

while(pixel under current is colored)
{
  lowest pixel coordinate = pixel under current
  current = pixel under
}

Luego haga lo mismo hacia arriba. ahora u han definido una sola línea. luego use los extremos de las líneas para hacer coincidir aproximadamente las líneas en rectángulos. si no son pixel perfecto que podría hacer algún tipo de tresholding.

 1
Author: data,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-30 01:42:50

El relleno de inundación funcionaría, o podría usar una modificación de un algoritmo de seguimiento de bordes.

Lo que haces es: crear una matriz 2d (o cualquier otra estructura de datos d2): cada fila representa una línea horizontal de píxeles en la pantalla, y cada columna una línea vertical

Itere a través de todos los píxeles, de izquierda a derecha, y cada vez que encuentre un color añadir sus coordenadas a la matriz

Iterar a través de la matriz y encontrar líneas y almacenar el píxel de inicio y final para cada uno (estructura de datos diferente)

Sabiendo que el comienzo de cada línea es su píxel izquierdo / superior, puede verificar fácilmente si alguna de las 4 líneas comprende un rectángulo

 1
Author: Zepee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-30 01:48:40

Para obtener de la imagen que tiene con las líneas horizontales y verticales casi tocando solo los rectángulos:

  1. Convertir a binario (es decir, todas las líneas son blancos, el resto es negro)
  2. Realice una dilatación binaria (aquí hace que cada píxel que toque un píxel blanco en la imagen de origen o sea un píxel blanco en la imagen de origen sea blanco. El toque es solo recto (por lo que cada píxel "toca" los píxeles a su izquierda, derecha, arriba y debajo de él) esto se llama "4-conectado"
  3. repita el paso 3 un par de veces si los espacios entre los extremos son más grandes que 2 píxeles de ancho, pero no demasiado a menudo!
  4. Realice una operación esqueleto (aquí hace que cada píxel en la imagen de salida sea negro si es un píxel blanco en la imagen de origen que toca al menos un píxel negro y los píxeles blancos que toca (en la imagen de origen) se tocan entre sí. De nuevo toque definido con 4-connectedness. Ver ejemplo a continuación.
  5. Repita el paso 4 hasta que la imagen no cambie después una repetición (todos los píxeles blancos son extremos de línea o conectores)

Esto, con un poco de suerte, primero mostrará las cajas con líneas gruesas de grasa, dejando artefactos gruesos de grasa por toda la imagen (después del paso 3) y luego después del paso 5 todos los artefactos gruesos de grasa se habrán eliminado, mientras que todas las cajas permanecen. Necesita tweek el número de repeticiones en el paso 3 para obtener mejores resultados. Si estás interesado en la morfología de la imagen, este es el libro de un curso introductorio realmente bueno que tomé.

Ejemplo: (0=negro, 1 = blanco, se consideran píxeles en el centro de cada bloque 3x3, entrada izquierda, salida derecha)

011 => 011    
011 => 001  all other white pixels touch, so eliminate      
011 => 011    

010 => 010    
010 => 010  top pixel would become disconnected, so leave      
010 => 010    

010 => 010    
010 => 000  touches only one white pixel, so remove     
000 => 000    

010 => 010    
111 => 111  does not touch black pixels, leave    
010 => 010    

010 => 010    
011 => 011  other pixels do not touch. so leave    
000 => 000    
 1
Author: jilles de wit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-07 22:54:34