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
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 .-
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)
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:
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.
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:
El script Completo se puede encontrar en mi github:
Uso: python websis-ocr.py 15.jpgTomando 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:
- Pueden seguirme en twitter @lorddemon