graphics - essential - titles pack premiere pro templates
¿Cómo reconocer rectángulos en esta imagen? (9)
Creo que estás buscando la transformada Hough generalizada .
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 comenzar? 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 el sitio web de la BBC aquí http://www.bbc.co.uk/
Actualice 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 por completo en las esquinas y, a veces, no forman completamente un rectángulo. ¡Gracias!
El relleno de inundación funcionaría, o podría usar una modificación de un algoritmo de seguimiento de bordes.
lo que hace 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
recorra todos los píxeles, de izquierda a derecha, y cada vez que encuentre un color, agregue sus coordenadas al conjunto
iterar a través de la matriz y buscar líneas y almacenar el píxel de inicio y final para cada una (estructura de datos diferente)
sabiendo que el comienzo de cada línea es su píxel izquierdo / superior, puede verificar fácilmente si hay 4 líneas que componen un rectángulo
Hay varios enfoques diferentes para su problema. Utilizaría una herramienta de procesamiento de imágenes morfológicas como esta . Tendrá la flexibilidad de definir "rectángulo" incluso algo que no esté "exactamente cerrado" (donde el algoritmo de relleno fallará).
Otra posibilidad podría ser utilizar un enfoque de aprendizaje automático , que básicamente se basa más en los datos que en la definición, como el anterior. Tendrás que darle a tu algoritmo varios "ejemplos" de lo que es un rectángulo, y eventualmente aprenderá (con un bias y una tasa de error).
Para obtener de la imagen que tiene con casi tocar líneas horizontales y verticales para solo los rectángulos:
- Convertir a binario (es decir, todas las líneas son blancas, el resto es negro)
- Realice una dilatación binaria (aquí hace que cada píxel que toca un píxel blanco en la imagen de origen o un píxel blanco en la imagen de origen sea blanco. El tacto es solo recto (de modo que cada píxel "toca" los píxeles a su izquierda, derecha, arriba) y debajo de esto) esto se llama "4-conectado"
- repita el paso 3 varias veces si las brechas entre los extremos son más grandes que 2 píxeles de ancho, ¡pero no demasiado a menudo!
- Realice una operación de esqueleto (aquí convierte cada píxel de la imagen de salida en 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) tocan entre sí. definido con 4 conexiones. Vea la muestra a continuación.
- Repita el paso 4 hasta que la imagen no cambie después de 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 gruesas líneas gruesas, dejando artefactos gruesos 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 ajustar la cantidad de repeticiones en el paso 3 para obtener mejores resultados. Si está interesado en la morfología de la imagen, este es el libro de un curso introductorio realmente bueno que tomé.
Muestra: (0 = negro, 1 = blanco, se están considerando los píxeles en el centro de cada bloque de 3x3, entrada a la izquierda, salida a la 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
Suponiendo que es una imagen razonablemente libre de ruido (no un video de una pantalla), entonces uno de los simples algoritmos de inundación debería funcionar. Es posible que deba ejecutar un dilatar / erosionar en la imagen para cerrar los huecos.
La forma normal de encontrar las líneas es una transformada Hough (luego encuentra las líneas en ángulo recto) Opencv es la forma más fácil.
Eche un vistazo a esta pregunta OpenCV Object Detection - Center Point
itere de izquierda a derecha hasta que golpee un pixel de color y luego use el algoritmo de inundación modificado. más información sobre el algo flood fill @ wiki
otro enfoque sería encontrar CUALQUIER pixel 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 haz lo mismo hacia arriba. ahora has definido una sola línea. luego use los extremos de las líneas para unir líneas aproximadamente en rectángulos. si no son perfectos, podrías cometer algún tipo de error.
Opencv (biblioteca de procesamiento de imágenes y visión por computador escrita en c) tiene una implementación para transformar harns (la simple transformación de hallar 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 esquina como cornerHarris que pueden ayudar.
Ejecuté la demo de houghlines provista con opencv y aquí está el resultado de la imagen que diste (líneas detectadas marcadas en rojo): texto alternativo http://imageapp.splintec.com/images/Screenshot2.png
En la visión por computadora hay un algoritmo llamado Transformación Hough Generalizada que quizás pueda resolver su problema. Debe haber un código fuente abierto que tenga implementado este algoritmo. Solo búscalo.