2012-02-21 13 views
10

Me gustaría aplicar OCR a algunas imágenes de pantallas de 7 segmentos en una pared. Mi estrategia es la siguiente:Encuentra la mejor región de interés después de la detección de bordes en OpenCV

  1. encubierta Img a escala de grises
  2. la falta de definición img para reducir bordes falsos
  3. Umbral del img para un img binaria
  4. Aplicar detección de Canny Edge
  5. Conjunto región de interés (ROI) base en un patrón dado por la silueta del número
  6. Escala ROI y la plantilla coinciden con la región

¿Cómo establecer un ROI para que mi programa no tenga que buscar la plantilla a través de toda la imagen? Me gustaría establecer mi ROI en la cantidad de bordes encontrados o algo más útil si alguien puede ayudarme.

Estaba investigando la clasificación de Cascade y Haar, pero no sé cómo aplicarlo a mi problema.

Aquí es una imagen después de haber sido pre-procesado y detecta el borde: an image after being pre-processed and edge detected

original de la imagen

enter image description here

+2

¿Se puede añadir también la imagen original? –

Respuesta

3

Si esto es representativo del número de aristas que tendrá que hacer frente a podría probar una buena estrategia ingenua como deslizar una ventana ROI-finder a través de la imagen binaria que solo suma los valores de píxel, y no se activa a menos que ese valor esté por encima de un umbral. Eso debería optimizar todas las superficies en blanco.

Edit: Ok algunos enfoques menos ingenuos. Si tiene algún conocimiento a priori, como si supiera que la fotografía está bien alineada (y no rotada o torcida), podría hacer algunos pasos con una rejilla baja-alta-baja-alta sintonizada para capturar los bordes a cada lado de una segmento, usando diferentes escalas en las dimensiones xey. Un buen golpe en ambas direcciones dará pistas no solo sobre el retorno de la inversión, sino también sobre la escala de la plantilla (las rejillas demasiado grandes y pequeñas no afectarán a ambos lados al mismo tiempo).

Puede realizar la detección de blobs y luego aplicar las plantillas a blobs (recurrir a la fusión de blobs si la puntuación de coincidencia de plantilla está por debajo de un umbral, en caso de que su segmento de número se particione accidentalmente). El tamaño del blob podría volver a darle alguna pista sobre la escala de la plantilla para aplicar.

+0

Este fue uno de mis planes originales. Me gustaría ver si hay algo por ahí menos ingenuo que pueda ayudarme. – locorecto

0

Antes que nada, dado que la imagen original tiene una pantalla LED y la región iluminada tiene una intensidad mayor que la del trest, realizaría una transformación de color Yuv en la imagen original y luego trabajaría con la intensidad plano (Y).

A continuación, si sabe que la imagen está bien alineada (es decir, no girada), le sugiero aplicar detectores de bordes horizontales y verticales separados en lugar de un detector de bordes genérico (no le interesan las líneas diagonales). P.ej.

sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5) 
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=5) 

de lo contrario podría utilizar la detección de contorno para encontrar los límites de los dígitos (aunque puede que tenga que realizar una dilate para cerrar los huecos entre los segmentos LED.

Siguiente Construiría histogramas horizontales y verticales de la salida de estas detecciones de borde o contorno. Esto le ayudaría a identificar las regiones 'ocupadas' de la imagen que contienen muchos bordes.

Finalmente, me gustaría establecer un umbral en el plano Y y explorar cada uno de los ROI con mi plantilla.

Cuestiones relacionadas