sábado, 21 de octubre de 2017

Reconocimiento Óptico de Caracteres, Un ejemplo

Hace algunos días me encontré con algunos sistemas CAPTCHA (Completely Automated Public Turing test to tell Computers and Humans Apart) bastante peculiares en Internet con algunas características interesantes como el uso pocos colores(1,2,3), con zonas determinadas, una fuente sin curvaturas, etc,etc.


Quiero compartir un pequeño análisis


Tomaremos por ejemplo los siguientes CAPTCHAS:


Figura 1: Ejemplo Numero 1

Figura 2: Ejemplo Numero 2

Figura 3: Ejemplo Numero 3

Análisis:
Cada imagen presenta 2 colores primarios, existe una degradación entre estos colores con una serie de letras y números en el centro de la imagen.

Figura 4: Colores primarios

Al ser una imagen sencilla se resolverá en 2 pasos:

Paso 1.-

Se debe colorear cada pixel que no sea una letra de color blanco, para esto usaremos los códigos RGBA seleccionando cada pixel que no cumpla con el patrón

        • R > 170  
        • G > 220
        • B < 250 

Si se cumple el pixel se pinta de Blanco y en lo contrario de Negro.


for y in xrange(alto):
        for x in xrange(ancho):
            if (pixel[x, y][0] > 170) and (pixel[x, y][1] > 220) and (pixel[x, y][2] < 250):
                pixel[x, y] = (0, 0, 0, 255)
            else:
                pixel[x, y] = (255, 255, 255, 255)


Paso 2 .-

En la parte inferior, alrededor del 75% al 100%(tomando como punto de partida la parte superior) cumplen con el patrón anteriormente mencionado, pero al ser una zona de la imagen que no presenta pixeles significativos para este análisis, se pintan todos de Blanco.


ancho = img.size[0]
alto = img.size[1]

altom = img.size[1] * 0.78

for y in xrange(int(altom),alto):
        for x in xrange(ancho):
            pixel[x, y] = (255, 255, 255, 255) 



Estas tareas realizan modificaciones en la imagen permitiéndonos obtener lo siguiente:
Figura 5: Salida de la imagen modificada.



Pytesseract


Pytesseract es una librería para python que sirve como Python wrapper para Google Tesseract, permitiendo reconocer y/o "leer" el texto incrustado en las imágenes.

Entonces usaremos el método image_to_string y limpiando la salida de cualquier cosa que no sea un numero o letra, como se muestra continuación:

print "Opcion 1: ",
    text1 = image_to_string(img)
    salida1 = re.sub('\W+','', text1 )
    print salida1


Así también se uso otra técnica de escalar la imagen  

big = im_orig.resize((ancho * porcentaje,alto * porcentaje), Image.NEAREST)

y luego analizar esta nuevamente con Pytesseract.

El script Completo se puede encontrar en mi github:


Uso: python websis-ocr.py 15.jpg
Tomando en cuenta la siguiente imagen:

Figura 6: Archivo con el nombre 15.jpg


Figura 7: Uso del Script.


Conclusiones:
Es relativa mente sencillo crear un script para romper un Captcha sin mucha complejidad(toda la tarde de un sabado), se recomienda utilizar:

Muchas gracias por su tiempo: