首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python captcha解码库

python captcha解码库
EN

Stack Overflow用户
提问于 2012-12-02 06:00:45
回答 3查看 16.7K关注 0票数 1

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

你知道有图书馆可以帮助我阅读这篇验证码吗?

如果你不知道用于阅读验证码的库,你能帮助我用PIL阅读这篇文章(以及其他类似的文章)吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-02 08:23:23

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

以下是解码它的一种虚拟方式。基本上,您需要的是从0到9的模式,如这些验证码中所示。从你的例子中,我只有0 3 4 5 7 8的模式。因为所有的东西都固定在它们上面,你知道在哪里拆分每个字符。你也知道每个字符都有一定数量的固定大小和固定字体。如果它还包含字母或更多字符,但具有固定的大小和字体,则可以很容易地修改以下代码。

代码的作用是: a)加载模式(我认为它们被命名为n0.png,n1.png,...);b)将验证码分割成多个片段;c)计算每个模式和每个分割数字之间的平方差之和;d)确定分割数字是和最小的那个。它按顺序返回验证码中出现的每个数字的列表。要获得初始模式,您可以取消对保存拆分数字的行的注释,在该片段后面放置一个return,然后调整文件名。

代码语言:javascript
复制
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])
票数 5
EN

Stack Overflow用户

发布于 2012-12-02 09:14:12

出于学术原因,这是一个很好的项目,不久前我对此很感兴趣。您有几个选项:

在此网站的帮助下,您可以使用自己的代码进行匹配:http://www.wausita.com/captcha/

  • You
  1. OpenCV to do the matching。

如果我认为有一个专用于神经网络图像匹配的库,但我似乎找不到它。

基本上,正如其他人所说,您希望删除噪声,将其分割为单个字符,并使用选定的技术将其与模型字符进行比较。

票数 2
EN

Stack Overflow用户

发布于 2012-12-02 06:27:31

我希望你是真诚地使用它,并且你不会伤害(/spam)任何人。

我不会给你写脚本,也不会把你转发给外部插件。但是如果你是自己写这篇文章,这可能会有帮助:

  • 如果你正在尝试解码特定的验证码模式,你应该收集所有的字符(我从你附加的例子中看到,它只是数字,所以不应该有太多的工作)。
  • 将所有的字符放在一个文件中,并使用PIL
  • 分析它。将每个字符、它的位置和它的含义保存在一个数组中。
  • 获取验证码图像-如果将验证码图像necessary.
  • Split为字符大小并在你的自制字符字典中划线,则清除背景噪音。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13664161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档