python 图片识别_python爬虫20 | 小帅b教你如何识别图片验证码

当你在爬取某些网站的时候

对于你的一些频繁请求

对方会阻碍你

常见的方式就是使用验证码

验证码的主要功能

就是区分你是人还是鬼(机器人)

想法设法的搞一些手段来对付技术

技术又能对付人们的想法

一来一去

就有了各种各样的变态验证码

也有了各种各样的应对方式

常见的验证码有这么几种

图像验证

语音验证

短信验证

极验验证

点击验证

今天

小帅b想跟你先说说如何识别图像验证码

那么

接下来就是

学习 python 的正确姿势

6412eb253d22693ca97477b9edb4ab99.gif

我们来看看这些图片验证码

15e8fc6b132b079fb86ee9c0dc2acb64.png

(此图来源网络)

可以发现

这些验证码大多是数字和字母组成

然后在此之上再添加一些像毛一样的线

或者搞一些噪点

或者把这些字符扭曲一下

为了增加识别难度也是辛苦人家了

接下来我们思考一下

我们要识别这类验证码要怎么做呢

67e3838d809620ffa703fd5c74e58849.png

首先要处理一下验证码图片

什么噪点乱七八糟的

我们尽量把它们去掉

让图片

尽量黑白

尽量只剩下字符本身

然后再用 python 强大的 OCR 工具

Python-tesseract

 来识别我们优化好的图片

这样正确率就会大大的提高

哎呀

我真是个聪明 boy 啊

4f1332d1e6586b60e03e5867df865f93.png

为了让你更清楚的知道怎么识别图像验证码

小帅b用 python 搞了几张识别难度不同的验证码

第一张

029d024ecb230441ea63fb565c76fd00.png

难度系数: 6e9c1cf8d3c93fa7741c884504fa2e52.png

第二张

ab2692329b36fb412688ea656adfd594.png

难度系数: e63723ae71d95fb6b62c997bb13a3677.png

第三张

58b1c4b8a0f0f64925c2023acf084b4e.png

难度系数: 98d482600010a813a9ccfd75f95f6536.png

第四张

d78468d719441a80e65d62e4b4aedd55.png

难度系数: efbdfb38074c83779771ae0d191a2b4d.png

第五张

e8cf14cda4ee054da7fde52fe6a234f5.png

难度系数 : c4de0fbcbcd41d3f48c000af1fa263c9.png

先对第一张进行识别

这张看起来没什么 "污染"

所以相对简单

先安装一下  pytesseract 

pip install pytesseract

接着安装一下  tesseract-ocr

如果你是 ubuntu 系统可以直接使用如下命令安装

sudo apt install tesseract-ocr

如果你是 win 系统自行 Google 一下安装  tesseract-ocr 以及环境变量配置

完了之后就导入相关模块到我们的代码文件中

try:    from PIL import Imageexcept ImportError:    import Imageimport pytesseract

接着我们就打开第一张图片

使用 pytesseract 识别

打印一下

captcha = Image.open("captcha1.png")result = pytesseract.image_to_string(captcha)print(result)

打印结果

a050106bf1350f82942a44f79d1167ba.png

ok,么有问题

671060bb7c253c0b539f7422d4812e43.png

接着我们来识别第 2 张

ab2692329b36fb412688ea656adfd594.png

captcha = Image.open("claptcha2.png")result = pytesseract.image_to_string(captcha)print(result)

结果打印出来是

4860855def0b3bea643da684d01d7696.png

1924??

5f4da328adcbb9e34e1138e5fae2f933.png

这就说明

pytesseract 是没办法识别太多噪点的图片的

如果这个图片再加上一点彩色背景

58b1c4b8a0f0f64925c2023acf084b4e.png

那么对 pytesseract 来说更是有点吃力的

所以我们先对这张图片灰度处理一下

captcha = Image.open("captcha2.png")result = captcha.convert('L')result.show()

图片就变成灰了

7e25b5b30427492cb01bd81a3ab52449.png

虽然灰了

但是还不够

我们除了处理灰度还需要对其 二值化

def convert_img(img,threshold):    img = img.convert("L")  # 处理灰度    pixels = img.load()    for x in range(img.width):        for y in range(img.height):            if pixels[x, y] > threshold:                pixels[x, y] = 255            else:                pixels[x, y] = 0    return img

调用一下

convert_img(captcha,150)

这时候图片就变成这样了

2330600712d4a06b2eb136c7d3fdad95.png

是不是一下子就清晰很多了呢

这时候我们对这张图片识别一下

# 识别一下result = pytesseract.image_to_string(result)print(result)

成功识别

5838e3be4d0ad3527347288107b3b79b.png

接下来我们再来看看有毛有噪的图片

d78468d719441a80e65d62e4b4aedd55.png

这时候直接去识别是识别不出来的

所以还是老办法

先处理灰度

再 二值化

这次我们再降一下噪

data = img.getdata()    w,h = img.size    count = 0    for x in range(1,h-1):        for y in range(1, h - 1):            # 找出各个像素方向            mid_pixel = data[w * y + x]            if mid_pixel == 0:                top_pixel = data[w * (y - 1) + x]                left_pixel = data[w * y + (x - 1)]                down_pixel = data[w * (y + 1) + x]                right_pixel = data[w * y + (x + 1)]                if top_pixel == 0:                    count += 1                if left_pixel == 0:                    count += 1                if down_pixel == 0:                    count += 1                if right_pixel == 0:                    count += 1                if count > 4:                    img.putpixel((x, y), 0)

图片变成这样了

b78cd0295338b7ea72a655c6e15c6961.png

再识别一下

5838e3be4d0ad3527347288107b3b79b.png

25f1f1778b3992e32d1eb899bbc5c133.gif

不过

pytesseract 不是万能的

对于稍微复杂一点的就识别不出来了

至于这张

e8cf14cda4ee054da7fde52fe6a234f5.png

你能看出它是 1l1l0oO0 么?

如果你能

算你牛逼

b65bc9350294692ea0e9cdf456186bdb.png

反正小帅b不能

所以 pytesseract 也不能

对于一些简单的验证码

使用 pytesseract 还是可以的

如果你想提高 pytesseract 识别率

还可以去搞些图片去训练一下 tesseract-ocr

876bf114ccbc19276582e1a9aa3f9740.png

ok

以上

主要让你了解一下图片识别库的使用

以及对一些图片的常用降噪操作

那么下次你爬到一些需要图像的简单验证码

应该不在话下了

下回见

听说你要 约 我啊!?

peace

2f0ab710ef609078698912da0a495603.png

      点个在看啊~~(破音)

272b1d0e0803631dfb2b38c41fc34d1b.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值