practitioner - biblioteca de decodificador de python captcha
deep learning for computer vision with python practitioner bundle (3)
Necesito un decodificador de Captcha para que python lea captchas simples de imágenes como la siguiente imagen:
¿Conoces una biblioteca que pueda ayudarme a leer este captcha?
Si no sabe de una biblioteca para leer captchas, ¿podría ayudarme a leer esto (y otros como este) con PIL?
Espero que lo estés usando de buena fe y no dañarás (/ spam) a nadie.
No te escribiré el guión ni te enviaré a un complemento externo. Pero en caso de que esté escribiendo esto por su cuenta, esto puede ayudar:
- En caso de que intente decodificar un patrón de captcha específico, debe recopilar todos los caracteres (vi en los ejemplos que adjuntó que son solo números, por lo que no debería ser demasiado trabajo).
- Pon todos los caracteres en un archivo y analízalo con PIL
- Guarde en una matriz cada char, su posición y su significado.
- Obtener una imagen de Captcha: borre el ruido de fondo si es necesario.
- Divida la imagen de Captcha en tamaño de char y cámbiela a través de su diccionario de caracteres hecho a sí mismo.
Es un buen proyecto para hacer por razones académicas, me interesó hace un tiempo. Tienes pocas opciones:
Usted escribe el suyo con la ayuda de este sitio: http://www.wausita.com/captcha/
Usas OpenCV para hacer la coincidencia.
Si crees que hay una libreria dedicada para la coincidencia de imágenes de redes neuronales, parece que no puedo encontrarla.
Básicamente, como dijeron los demás, desea eliminar el ruido, dividirlo en caracteres únicos y compararlo utilizando una técnica elegida para los modelos de caracteres.
Espero que este captcha no se use en ninguna parte.
Lo siguiente es una forma ficticia de descifrarlo. Básicamente lo que necesitas son los patrones del 0 al 9 como están presentes en estos captchas. De tus ejemplos, tengo solo los patrones para 0 3 4 5 7 8. Como todo está fijo en ellos, sabes dónde dividir cada personaje. También sabe que cada carácter es una cantidad de tamaño fijo y fuente fija. Si también incluye letras o más caracteres, pero de tamaño fijo y fuente, el siguiente código se puede adaptar fácilmente.
Lo que hace el código es: a) cargar los patrones (consideré que se llaman n0.png, n1.png, ...); b) dividir el captcha en piezas NUMS; c) hacer una suma de las diferencias al cuadrado entre cada patrón y cada número dividido; d) decidir que el número de división es el que tiene la suma más pequeña. Devuelve una lista para cada número, en orden, presente en el captcha. Para obtener los patrones iniciales, puede descomentar las líneas que guardan los números divididos, colocar una return
después de esa pieza y ajustar los nombres de los archivos.
import sys
from PIL import Image, ImageOps
PAT_SIZE = (8, 10)
NUMS = 3
FIRST_NUM_OFFSET = 5
NUM_OFFSET = (1, 3)
NUMBERS = []
for i in xrange(10):
try:
NUMBERS.append(Image.open(''n%d.png'' % i).load())
except IOError:
print "I do not know the pattern for the number %d." % i
NUMBERS.append(None)
def magic(fname):
captcha = ImageOps.grayscale(Image.open(fname))
im = captcha.load()
# Split numbers
num = []
for n in xrange(NUMS):
x1, y1 = (FIRST_NUM_OFFSET + n * (NUM_OFFSET[0] + PAT_SIZE[0]),
NUM_OFFSET[1])
num.append(captcha.crop((x1, y1, x1 + PAT_SIZE[0], y1 + PAT_SIZE[1])))
# If you want to save the split numbers:
#for i, n in enumerate(num):
# n.save(''%d.png'' % i)
def sqdiff(a, b):
if None in (a, b): # XXX This is here just to handle missing pattern.
return float(''inf'')
d = 0
for x in xrange(PAT_SIZE[0]):
for y in xrange(PAT_SIZE[1]):
d += (a[x, y] - b[x, y]) ** 2
return d
# Calculate a dummy sum of squared differences between the patterns
# and each number. We assume the smallest diff is the number in the
# "captcha".
result = []
for n in num:
n_sqdiff = [(sqdiff(p, n.load()), i) for i, p in enumerate(NUMBERS)]
result.append(min(n_sqdiff)[1])
return result
print magic(sys.argv[1])