专栏首页毛利学Python字符型验证码识别

字符型验证码识别

字符型验证码

1. 什么是验证码

在开发爬虫的过程中会遇到一种常见的反爬措施,验证码。验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。

2. pillow

Python传统的图像处理库PIL(Python Imaging Library ),可以说基本上是Python处理图像的标准库,功能强大,使用简单。

官方文档:https://pillow.readthedocs.io/en/latest/installation.html

Pillow的安装比较的简单,直接pip安装即可:

pip install Pillow

由于是继承自PIL的分支,所以Pillow的导入是这样的:

import PIL 
# 或者
from PIL import Image

3.常用属性

  • PIL.Image.filename 图像源文件的文件名或者路径,只有使用open()方法创建的对象有这个属性。 类型:字符串
  • PIL.Image.format 图像源文件的文件格式。
  • PIL.Image.mode 图像的模式,一般来说是“1”, “L”, “RGB”, 或者“CMYK” 。
  • PIL.Image.size 图像的大小
  • PIL.Image.width 图像的宽度
  • PIL.Image.height 图像的高度
  • PIL.Image.info 图像的一些信息,为字典格式

字符串验证码的处理

这是code.png

4.1 灰度化

一张图片由很多像素点构成,一个像素点的颜色是由RGB三个值来表现的 R=G=B 这个值就叫做灰度值 白色255 黑色0

R * 0.3 +G * 0.59 + B * 0.11

from PIL import Image
image = Image.open('code.png')
im = image.convert('L')
im.show()

效果如下

4.2 二值化

先灰度在二值化

利用一个阈值来判断一个图像的像素点是0还是255,小于阈值像素点就变为0,大于阈值像素点编程255

常用阈值选择的方法是:

  • 灰度平局值法:取127 (0~255的中数, (0+255)/2 = 127)

平均值法:

  • 计算像素点矩阵中的所有像素点的灰度值的平均值avg
from PIL import Image
def binazing(image):
    '''
    对图片进行灰度和二值化
    :param image:
    :return:
    '''
    image = image.convert('L')
    # 增强对比度
    image = image.point(lambda x: 1.2 * x)
    w,h = image.size
    # print(w,h)
    ### 二值化
    pixdata = image.load()
    for i in range(h):
        for j in range(w):

            if pixdata[j,i] > 170:
                pixdata[j,i] = 255
            else:
                pixdata[j, i] = 0
    return image
if __name__ == '__main__':
    image = Image.open('code.png')
    image = binazing(image)
    image.show()

效果如下

4.3 降噪

经过了二值化处理,整个图片像素就被分为了两个值0和255, 如果一个像素点是图片或者干扰因素的一部分,那么她的灰度值一定是0(黑色),如果一个点是背景,其灰度值应该是255,白色

所以对于孤立的噪点,他的周围应该都是白色,或者大多数点都是白色的,所以在判断的时候条件应该放宽,一个点是黑色并且相邻的点为白色的点的个数大于一个固定的值,那么这个点就是噪点。

说白了就是一个黑点周围都是白色的就是噪点

def depoint(image):
    '''
    对图片进行降噪
    :param image:
    :return:
    '''
    pixdata = image.load()
    w,h = image.size
    for y in range(1,h-1):
        for x in range(1,w-1):
            count = 0 # 用来判断是否达到噪点的要求
            # 一个点的八个方向,就是3X3矩阵中,噪点是5的位置
            # 245是可以变的值,但最好不要是250以上
            if pixdata[x,y-1] >245:
                count =count +1
            if pixdata[x,y+1] >245:
                count =count +1
            if pixdata[x-1,y] >245:
                count =count +1
            if pixdata[x+1,y] >245:
                count =count +1
            if pixdata[x-1, y - 1] > 245:
                count = count + 1
            if pixdata[x+1, y + 1] > 245:
                count = count + 1
            if pixdata[x - 1, y+1] > 245:
                count = count + 1
            if pixdata[x + 1, y-1] > 245:
                count = count + 1
            if count>4:
                pixdata[x,y] =255
    return image

效果如下

识别

下面是用比较古老的pytesser3识别验证码

github地址:https://github.com/tesseract-ocr/tesseract/wiki

下载地址:https://github.com/UB-Mannheim/tesseract/wiki

注意记得添加环境变量

新建TESSDATA_PREFIX 环境变量

cmd下可以运行tesseract

安装

pip install pytesseract 

只需要就可以了

pytesseract.image_to_string(image)

最终识别出来了,TBQ还有一个L没有识别出来,这是我调了很多次的对比度最好的结果

6. 反思

对于需要准确度高的识别,需要使用百度的api,而不是使用传统的方法。

本文分享自微信公众号 - Python之王(gh_70a22bfa8e3a),作者:小sen

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 和我一起看看,国外的Python考试到底是怎么样(上篇)

    我是在4月底帮别人考试的,然后别人发过来去年的考试题的。我看了下,全是英文,原来是留学生啊。

    润森
  • Python迭代器和生成器

    比如:列表[0,1,2],元组(1,2,3),字典{’0:'0','1':"1'} 集合{1,2,3}都是容器

    润森
  • 爬了CSDN,我发现了这些

    本文涉及到的Python第三方模块,共计五个:分词模块jieba,文字云模块wordcloud,画图模块matplotlib,用来处理背景图片的模块cv2,访问...

    润森
  • [- Flutter 技能篇 -] ui.Image加载探索

    张风捷特烈
  • Swift:轻量级API的设计(一)

    Swift的最强大功能之一就是在设计API方面给我们提供了极大的灵活性。这种灵活性不仅使我们能够定义易于理解和使用的函数和类型,还使我们能够创建给人以非常轻量级...

    韦弦zhy
  • Python字符串必记函数

    Python字符串函数数不胜数,想要记完所有几乎不可能,下列几个是极为重要的一些函数,属于必记函数。

    py3study
  • 自适应免费开源主题——Dobby

    神无月
  • ios上传App Store提交审核报错 ERROR ITMS-90174解决办法

    先看看是不是plist文件里有‘Icon’的字样,删除相关的配置 然后下载软件:在AppStore搜索App Icon Gear,上传图片重新生成图标,启动图...

    24-丰总
  • 免费IP查询接口-个人站点

    周末新写了一个IP查询的网站, 今天刚刚上限,地址:http://ip.shenlin.ink,程序后端为thinkPHP框架开发,前端使用layui框架进行布...

    申霖
  • python3------基础语法

      下划线命名法(python中推荐使用):单词都使用小写字母,单词与单词之间使用_下划线连接 

    py3study

扫码关注云+社区

领取腾讯云代金券