Estoy escribiendo una aplicación de OCR para leer caracteres de una imagen de captura de pantalla. Actualmente, me estoy enfocando solo en los dígitos. Estoy basando parcialmente mi enfoque en esta publicación de blog: http://blog.damiles.com/2008/11/basic-ocr-in-opencv/.OCR de texto de baja resolución de capturas de pantalla
Puedo extraer con éxito cada carácter individual usando algunos umbrales inteligentes. Donde las cosas se ponen un poco complicadas es hacer coincidir los personajes. Incluso con el tamaño y la fuente de fuente fija, existen algunas variables como el color de fondo y el interletraje que hacen que aparezca el mismo dígito en formas ligeramente diferentes. Por ejemplo, la imagen de abajo se divide en 3 partes:
- Top: un dígito objetivo que extraje con éxito de una captura de pantalla
- Medio: la plantilla: un dígito de mi conjunto de entrenamiento
- En pocas palabras: la error (diferencia absoluta) entre las imágenes superior e intermedia
Todas las partes han sido escaladas (la distancia entre las dos líneas horizontales verdes representa un píxel).
se puede ver que a pesar de la parte superior e imágenes secundarias que representa claramente un 2, el error entre ellos es bastante alto. Esto causa falsos positivos al hacer coincidir otros dígitos; por ejemplo, no es difícil ver cómo un 7 bien ubicado puede hacer coincidir el dígito objetivo en la imagen superior mejor que la imagen del medio.
Actualmente, estoy manejando esto teniendo un montón de imágenes de entrenamiento para cada dígito, y haciendo coincidir el dígito de destino con esas imágenes, uno a uno. Traté de tomar la imagen promedio del conjunto de entrenamiento, pero eso no resuelve el problema (falsos positivos en otros dígitos).
Soy un poco reacio a realizar coincidencias usando una plantilla desplazada (sería esencialmente lo mismo que lo que estoy haciendo ahora). ¿Hay una mejor manera de comparar las dos imágenes que la simple diferencia absoluta? Estaba pensando en algo como el EMD (distancia de movimiento de tierra, http://en.wikipedia.org/wiki/Earth_mover 's_distance) en 2D: básicamente, necesito un método de comparación que no sea tan sensible al cambio global y pequeños cambios locales (los píxeles al lado de un píxel blanco se vuelven blancos , o píxeles junto a un píxel negro que se vuelve negro), pero es sensible a los cambios globales (los píxeles negros que no están cerca de los píxeles blancos se vuelven negros, y viceversa).
¿Alguien puede sugerir un método de coincidencia más efectivo que la diferencia absoluta?
Estoy haciendo todo esto en OpenCV utilizando las envolturas Python C-style (import cv
).
Gracias! Definitivamente voy a echar un vistazo a las cascadas de Haar. ¿Qué tan eficiente crees que será comparado con la simple resta de imágenes? Espero que sea más lento. Sin embargo, si es 5 veces más lento pero reemplaza 10 controles de imagen por la misma efectividad, definitivamente valdría la pena. – misha
Tendrá que generar cascadas, que es un proceso bastante lento (pero también estúpidamente paralelizable). También requiere un montón de datos de entrada (usaría los números en cada fuente que tenga en un escritorio). – rsaxvc
Más lento que la resta, pero puede buscar una imagen para todas las instancias de una determinada cascada a la vez. – rsaxvc