python验证码解码器库

2 8*_*2 8 1 python captcha image image-processing python-imaging-library

我需要一个用于python的Captcha解码器来读取简单的图像验证码,如下图所示:

验证码

简单的验证码

验证码

你知道一个可以帮我读这个验证码的图书馆吗?

如果你不知道用于阅读验证码的图书馆,你能帮我用PIL阅读这个(以及其他类似的东西)吗?

mmg*_*mgp 5

我希望这个验证码不会在任何地方使用.

以下是解码它的虚拟方法.基本上你需要的是这些验证码中出现的从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])
Run Code Online (Sandbox Code Playgroud)