我需要python的验证码解码器来读取简单的图像验证码,如下图所示:
您是否知道可以帮助我阅读此验证码的图书馆?
如果您不知道用于读取验证码的库,是否可以帮助我使用PIL读取此内容(以及其他类似内容)?
最佳答案
我希望此验证码不会在任何地方使用。
以下是一种将其解码的伪方法。基本上,您需要的是这些验证码中显示的从0到9的模式。从您的示例中,我只有0 3 4 5 7 8的模式。由于所有内容都已固定在它们上,因此您知道在何处分割每个字符。您还知道每个字符都是一定数量的固定大小和固定字体。如果它还包含字母或更多字符,但是具有固定的大小和字体,则可以轻松地修改以下代码。
代码的作用是:a)加载模式(我认为它们被命名为n0.png,n1.png等); b)将验证码分成NUMS个; c)对每个模式与每个分割数之间的平方差求和; d)决定分割数是总和最小的数。它按顺序返回验证码中存在的每个数字的列表。要获得初始模式,您可以取消注释保存拆分号的行,在该段后放置return
并调整文件名。
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])
关于python - python验证码解码器库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13664161/