12 字符验证码

12 字符验证码

一、验证码简介

什么是验证码?

验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写。

是一种用来区分用户是计算机还是人的公共全自动程序。

验证码的作用?

认证码是一种人机识别手段,最终目的是区分正常用户和机器的操作。

可以防止:恶意破解密码、注册、刷票、论坛灌水,防止黑客对用户的密码进行暴力破解。

一般是提出一个问题,这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答这个的问题,所以回答出问题的用户就可以被认为是人类。

验证码类别

验证码自面世以来就一直在更新,迭代。

图形验证码:这类验证码大多是计算机随机产生一个字符串,在把字符串增加噪点、干扰线、变形、重叠、不同颜色、扭曲组成一张图片来增加识别难度。

滑动验证码:也叫行为验证码,比较流行的一种验证码,通过用户的操作行为来完成验证,其中最出名的就是极验。

滑动验证码的原理就是使用机器学习中的深度学习技术,根据一些特征来区分是否为正常用户。通过记录用户的滑动速度,还有每一小段时间的瞬时速度,用户鼠标点击情况,以及滑动后的匹配程度来识别。而且,不是说滑动到正确位置就是验证通过,而是根据特征识别来区分是否为真用户,滑到正确位置只是一个必要条件。

点触验证码:点击类验证码都是给出一张包含文字的图片,通过文字提醒用户点击图中相同字的位置进行验证。

二、Pillow库

PIL库
PIL (Python Image Library) 已经算是 Python 处理图片的标准库了,兼具强大的功能和简洁的 API.
但是PIL库的更新非常缓慢, 并且它只支持到python2.7,不支持python3

Pillow
由于PIL库更新太慢了,于是于是一群志愿者在PIL库的基础上创建了一个新的分支版本,命名为Pillow.
Pillow目前最新支持到python3.6,它的维护和开发十分活跃,兼容PIL库的绝大多数语法,并且增加了许多新的特性,推荐直接使用Pillow

注意点
Pillow和PIL不能共存在一个环境中,如果你之前安装了PIL的话,需要删除掉才能在安装Pillow
由于是继承自PIL的分支, 所以Pillow库的导入是这样的
Import PIL

1、PIL基本概念

PIL中所涉及的基本概念有如下几个:通道(bands)、尺寸(size)、坐标系统(coordinate system)。

通道

每张图片都是由一个或者多个数据通道构成,如果这些通道具有相同的维数和深度,PIL允许将这些通道进行叠加
以RGB图像为例,每张图片都是由三个数据通道叠加构成,分别为R 、G 、B。
对于灰度图像(没有色彩的图片, RGB色彩分量全部相等),只有一个通道。
灰度指的是黑白图像中点的颜色深度,范围一般是0到255, 白色为255,黑色为0

对于一张图片的通道数量和名称,可以通过方法getbands()来获取。方法getbands()是PIL中Image子模块的方法,它会返回一个字符串组成的元祖,元祖中包括了每一个通道的名称。

尺寸

图片尺寸(size)指的是图片的宽度和高度
通过size属性可以获取图片的尺寸,它的返回值是一个元祖,元祖里面有两个值,分别是水平和垂直方向上的像素个数

坐标系统

PIL使用笛卡尔像素坐标系统,图像的左上角为左边的原点(0,0),这就意味着,x轴的数值是从左到右增长的,y轴的数值是从上到下增长的。
在我们处理图像的时候,常常需要去表示一个矩形的图像区域。Pillow中很多方法都需要传入一个表示矩形区域的元祖
这个元祖包含四个值,分别表示矩形四条边距离x轴或者y轴的距离。顺序是(左,顶,右,底)
例如,一个800x600的像素图像表示为(0, 0, 800, 600)

from PIL import Image

im = Image.open('yasuo.jpg')

# 获取通道
print('通道:', im.getbands())
# 获取尺寸size
print('尺寸:',im.size)

# 调用系统默认图片打开应用打开
im.show()

2、PIL操作图像

Image是Pillow中最为重要的类,实现了Pillow中大部分的功能,创建这个类的实例主要有三个方式:

1.从文件中加载图像

2.创建一个新的图像

3.处理其他的图像获得

from PIL import Image

im1 = Image.open('yasuo.jpg')

im2 = Image.new('RGB', (200,200), 'red')

im3 = im1.crop((100, 100, 200, 200))

im2.show()
im3.show()

三、简单验证码处理

1、灰度化

像素点是最小的图片单元,一张图片由很多像素点构成,一个像素点的颜色是由RGB三个值来表现的,所以一个像素点对应三个颜色向量矩阵,我们对图像的处理就是对这个像素点的操作。

图片的灰度化,就是让像素点矩阵中的每一个像素点满足 R=G=B,此时这个值叫做灰度值,白色为0,黑色为255

灰度转化一般公式为:

R=G=B = 处理前的 RX0.3 + GX0.59 + B*0.11

from PIL import Image

im1 = Image.open('yasuo.jpg')

# 灰度化
im2 = im1.convert('L')

im2.show()

2、二值化

图像的二值化,就是将图像的像素点矩阵中的每个像素点的灰度值设置为0(黑色)或255(白色),从而实现二值化,将整个图像呈现出明显的只有黑和白的视觉效果。

二值化原理是利用设定的一个阈值来判断图像像素是0还是255, 一般小于阈值的像素点变为0, 大于的变成255

这个临界灰度值就被称为阈值,阈值的设置很重要,阈值过大或过小都会对图片造成损坏

选择阈值的原则是:既要尽可能保存图片信息,又要尽可能减少背景和噪声的干扰

常用阈值选择的方法是:

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

平均值法:计算像素点矩阵中的所有像素点的灰度值的平均值avg

迭代法:选择一个近似阈值作为估计值的初始值,然后进行分割图像,根据产生的子图像的特征来选取新的阈值,在利用新的阈值分割图像,经过多次循环,使得错误分割的图像像素点降到最小。

from PIL import Image

im1 = Image.open('yasuo.jpg')

w,h = im1.size

# 获取像素点集合
pixdata = im1.load()

im1.show()

for x in range(w):
    for y in range(h):
        p = list(pixdata[x, y])
        if p[0] <127:
            p[0] = 0
            p[1] = 0
            p[2] = 0
        else:
            p[0] = 255
            p[1] = 255
            p[2] = 255
        pixdata[x, y] = tuple(p)

im1.show()

3、降噪

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

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

我们根据一个点A的RGB值,与周围的8个点的RBG值比较,设定一个值N(0 <N <8),当A的RGB值与周围8个点的RGB相等或者小于N时,此点为噪点

四、OCR识别

OCR (Optical Character Recognition)光学字符识别, 指的是对文本资料的图像文件进行分析识别处理,获取文集及版面信息的过程

Tesseract-OCR是一个开源的字符识别引擎,我们可以用他来识别一些简单的验证码。

Windows安装:

安装文件在

Linux安装:

sudo apt-get install tesseract-ocr

sudo apt-get install libtesseract-dev

Mac安装:

brew install tesseract

Pytesser3是一个在Python内使用Tesseract-Ocr的库,安装非常简单:

pip install Pytesser3

然后需要进行配置, 将pytesser3包下面init文件内tesseract_exe_name的值设置为为你的tesseract.exe的路径

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容