python图形验证码识别_一起学python-opencv三十(图像验证码识别)

上一讲我们学习的是人脸检测,只是检测到人脸所在的区域,这一讲说的是图片验证码识别,是要有识别在里面的。先介绍什么叫做OCR:

利用pytesseract实现图片验证码识别

我们用到的核心模块是pytesseract,关于这个模块如何配置,参考:https://www.cnblogs.com/zhangxinqi/p/9297292.html#_label1

这个地方我的选择是把所有的都勾上了,当然你可以选择自己想要的勾上,我只是觉得这样省事。这个安装位置也不一定非要在c盘,只要配置一下环境变量就行了。下载过程中可能会出现很多次:

不过没有问题的,点确定就行了,这样只是有一些小语种的包安装错误。或者你可以按照上面说的用github装,然后解压到安装的文件夹。配置环境变量我们已经很熟悉了,这个过程相当于在linux下把bin文件放在/usr/bin或者/usr/sbin下面。在命令行输入tesseract,显示

说明已经配置成功了。

这是一些帮助信息。

-l是指定语言的,eng是英语,指定语言应该会识别速度快很多了。我们来试一张:

结果为什么是这样的呢?这是因为图片中有噪声,所以需要在opencv里面或者其它可以图像处理软件中先进行预处理,我们用的是python-opencv,我们想要实现的是用python实现一条龙处理,而不是用python-opencv预处理,然后再在命令行里处理。这也是我们为什么要安装pytesseract的原因,因为不安装这个tesseract和python之间没有接口。

看来我以前已经装过了。如果配置了环境变量,在用的时候是不会出现上述问题的。

这里读图像用的是PIL而不是opencv自带的,我们需要安装。参考了:https://jingyan.baidu.com/article/fea4511a20d98af7ba912551.html

PIL这个模块的介绍,参考:https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00140767171357714f87a053a824ffd811d98a83b58ec13000

感兴趣的可以去看原文,我比较好奇它读进来的数据和opencv读进来的有什么不同吗?

这个读进来并不是一个数组,而是一个文件对象。看来都是可以识别到的啊,无论是opencv读进来的还是PIL读进来的,只不过结果稍微不太一样,虽然都是错的,这需要我们先预处理。先来简单看一下pytesseract有哪些函数:

我们常用的是image_to_string,这个函数应该是用现成

原文中还有和爬虫结合实现验证码识别的,不过这种方式其实会有很多问题的,下面试验的时候就会看得到了。我们要先对这张图片进行一些预处理。我上豆瓣找了一些图片验证码,说实话,现在用图片验证码的其实比较少,很多都是拼图形式的或者是扫码,因为图片验证码确实太容易被破解了。我们可以随便找几个验证码来试一试,我用的是tx的一个网站:http://captcha.qq.com/getimage?aid=10079010r=0.38687027756482356

只需要改aid就可以得到不同的验证码,用这个的原因是这个比较纯净。

这个验证码就很好,噪声几乎没有,这个字母的封闭性很好。

前两个字母识别的是有问题的。怎么看都是DawZ。两种识别的结果都一样,都是错的。指定

语言也是错的。

输入彩色图像还是这样:

其实识别错很正常,毕竟没有方法可以做到百分百识别的。我们再试一个:

这个识别不出来?这个字母的封闭性就差一些。没关系,再试一个:

还是识别不了。enmmm,再试一个:

效果还是特别差。

这个视频里面做例子用的都是:

这种验证码,这种验证码最大的特点就是数字和字母都是没有倾斜的,但是现在基本上不会有这么好的验证码。我又找了豆瓣的两个验证码:

这识别难度都挺大的,不仅是字母是歪的,还有很多噪声。我们也不用试tesseract自带的字库了,它用的训练集估计就没有这样歪的字,或者它用的方法没有考虑到字体歪斜,前面的光是字母歪就难识别,还要带噪声更是识别不了,不过姑且还是试验一下:

效果果然很差。我在网上又找了一个OCR的网站:

https://www.onlineocr.net/

我们可以试一试:

效果也很差。我来看看大企业的表现。

用百度的API识别

参考https://cloud.baidu.com/doc/OCR/OCR-Python-SDK.html#.AD.45.25.42.6F.4C.89.80.FE.B7.28.00.A2.07.E8.17

先创建一个百度云账号,然后进入控制台:

https://console.bce.baidu.com/ai/#/ai/ocr/overview/index

一开始这个已建应用应该是0个,这个是我已经创建好的,点击创建应用就可以创建,然后填几个空就可以。

然后立即创建。

我们就算用高精度的,一天也可以免费用500次,这完全足够我们个人用了,下面我们要试一试效果:

创建成功后,点击管理应用

这里有几个东西我们待会要用。

按照上面步骤做好。

好,我们来写一下这段代码:

看看结果还不错,

但是还是错了一个字母,这个识别出来试一个单词,因为中间没有空格,总得来说,效果要比上面好多了,这种输出格式叫做json,以前也是见过的。如果我们只要结果。

再试几个:

完全正确。

错了两个字母。

这个效果就不太理想了。其实前面用的并不是高精度,因为函数是basicGeneral,这个是通用的,basicAccurate才是高精度的。

效果更差了。

效果还是不是很好,不过感觉其实已经很不错了,可能需要预处理一下图片,不过预处理没有通用的办法啊,这个事其实还是挺难办,不过百度做的确实已经很好了。图像处理这东西本来其实就挺难的,因为有很强的环境性,如果你想破解某个网站的验证码,最好的办法就是用这个网站的验证码做数据集去训练一个神经网络,因为每家网站图片加噪声的方式可能都不一样。不过数据集的标记是个问题,要想网络泛化性强,就必须要有足够大的数据集,图片验证码可以用爬虫,但是标记就得人为标记,这个比较费时间,虽然网上有可以花钱请人标记的,不过我是花不起。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值