Procesamiento de imagen: ¿Cómo detectar un letrero cuadrilátero en la imagen?

14

¿Cómo puedo detectar un letrero cuadrilátero de una imagen capturada con un teléfono móvil? ¿Como puedo detectar formas como un rectángulo? rectángulo redondeado (esquinas redondeadas en lugar de esquinas de forma)?

Estoy usando opencv.wrapper pero soy nuevo en esto.

Gracias.

Aquí está la muestra: texto alternativo http://www.freeimagehosting.net/uploads/b03442fd36.png

texto alternativo http://www.freeimagehosting.net/uploads/e6b36040e8.png

Debido al ruido y muchas líneas allí, no puedo determinar cuál es la línea límite del letrero. A veces puedo encontrar el límite de las líneas después de la transformación de hough. Estoy atrapado ... en este tipo de escenario ...

Estas son las 2 imágenes en bruto tomadas desde la cámara del teléfono móvil

texto alternativo http://www.freeimagehosting.net/uploads/6dbd613edf.jpg texto alternativo http://www.freeimagehosting.net/uploads/720da20080.jpg

¿Necesito un consejo para ver cómo puedo procesar la imagen para sacar el letrero?

Muchas gracias


fuente
2
Palabras clave: opencv, hough transform Duplicados: stackoverflow.com/questions/1817442 stackoverflow.com/questions/2068013
Sí, ¿cómo transformar FTW!
pero hay ruido en la imagen, ¿cómo puedo averiguar cuál es el límite del letrero
@ xabi123: transformación de hough, umbral, límite de lectura
1
¿Podrías compartir una imagen de muestra?

Respuestas:

7

Ambas imágenes contienen muchas líneas que no tienen nada que ver con el signo que está buscando. Y algunas de esas líneas son más largas / tienen un mayor contraste que las líneas que realmente desea, por lo que creo que detectar las líneas de borde (por ejemplo, usando una transformación de hough o sumando contrastes horizontal / verticalmente) no funcionará.

Pero: el signo que está buscando tiene otras características que deberían ser más fáciles de detectar:

  • El fondo de la señal tiene un brillo (casi) constante
  • Ocupa un área relativamente grande de la imagen.
  • Está cerca del centro de la imagen.

Por lo tanto, está buscando una gran área conectada con bajo contraste. He pirateado un algoritmo de prueba de concepto en Mathematica. (No soy un experto en OpenCV, pero mencionaré la función de OpenCV correspondiente cuando los conozca).

Primero, uso filtros derivados de Gauss para detectar la magnitud del gradiente en cada píxel. El filtro derivado gaussiano tiene una apertura amplia (11x11 píxeles en este caso), por lo que es muy insensible al ruido. Luego normalizo la imagen de gradiente para que signifique = 1, de modo que pueda usar los mismos umbrales para ambas muestras.

src = Import["http://www.freeimagehosting.net/uploads/720da20080.jpg"];
pixels = ImageData[ColorConvert[src, "Grayscale"]];
gradient = Sqrt[GaussianFilter[pixels, 5, {1, 0}]^2 + GaussianFilter[pixels, 5, {0, 1}]^2];
gradient = gradient/Mean[Flatten[gradient]];

Implementación de OpenCV: puede usar sepFilter2Dpara el filtrado real, pero aparentemente, tendrá que calcular los valores del núcleo del filtro usted mismo .

El resultado se ve así:

magnitud gradiente

En esta imagen, el fondo del letrero es oscuro y los bordes del letrero son brillantes. Entonces puedo binarizar esta imagen y buscar componentes conectados oscuros.

binaryBorders = Binarize[Image[gradient], 0.2];
sign = DeleteBorderComponents@ColorNegate[binaryBorders];
largestComponent = SortBy[ComponentMeasurements[sign, {"Area", "ConvexVertices"}][[All, 2]], First][[-1, 2]];

Implementación de OpenCV: los umbrales deben ser sencillos, pero creo que OpenCV no contiene análisis de componentes conectados; puede usar relleno de inundación o cvBlobsLib para eso.

Ahora, solo encuentre el blob más grande cerca del centro de la imagen y encuentre el casco convexo (simplemente he usado el blob más grande que no está conectado al fondo, pero que podría no ser suficiente para cada imagen).

Resultados: ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

Niki Estner
fuente
0

Otro enfoque que puede adoptar y que es más robusto para los ruidos en esta situación es generar una curva del nivel de gris medio de la imagen a lo largo del eje xy a lo largo del eje y. Es decir, calcule el nivel medio de gris para cada línea / columna en la imagen.

Si, por ejemplo, el letrero (o sus bordes) es más claro que su entorno (como es el caso de todos los ejemplos que se muestran en la pregunta), tendrá dos picos en la curva del eje x (para los bordes izquierdo y derecho y los bordes ) y dos picos en la curva del eje y (para los bordes superior e inferior). Usando una técnica de detección de bordes para una señal de 1 dimensión (quizás un filtro de paso alto) puede deducir las coordenadas de las esquinas del letrero.

He visto que este enfoque se usa para detectar placas y también para el reconocimiento facial (la nariz tiende a ser la parte más brillante de la cara, por lo que genera un pico en las curvas del eje x y del eje y).

Alceu Costa
fuente
hmm ... ¿y si el letrero se gira o la cámara se rueda?
Mustafa
0

Esta podría ser una pequeña idea al revés, pero podría valer la pena probarla. En lugar de intentar detectar el rectángulo y pensar en el texto como ruido , tal vez pueda tratar el texto como información y usarlo para detectar el rectángulo más fácilmente.

Aquí está el bosquejo de la idea:

  • detectar el texto en la imagen . No es necesario que sea una implementación sólida (debería poder buscar en Google una pequeña biblioteca que lo haga, o tal vez OpenCV lo tenga), solo una estimación aproximada del texto en la imagen
  • encuentra el cener de todas las detecciones de texto . Incluso con imágenes ruidosas debería estar alrededor del lugar real
  • Hough engaño rectángulo en el área alrededor de las detecciones de texto . Tal vez use la distancia media desde el centro de las detecciones de texto, o algo similar. Hacer diferentes diámetros y tome el recuerdo más fuerte .

Las explicaciones y ventajas:

  • el área alrededor del texto es generalmente homogénea: el rectángulo real debería ser el primer recuerdo fuerte
  • de esta manera, no tiene que hacer una transformación suficiente en toda la imagen, por lo que puede hacerlo más turalmente (tal vez varias veces en la misma área pero con diferentes tamaños de cubos ...)
penelope
fuente