文章目录
一、认识验证码
1.1、概念
验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种用来区分用户是计算机还是人的公共全自动程序。
1.2、作用
认证码是一种人机识别手段,最终目的是区分正常用户和机器的操作。
可以防止:恶意破解密码、注册、刷票、论坛灌水,防止黑客对用户的密码进行暴力破解。
一般是提出一个问题,这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答这个的问题,所以回答出问题的用户就可以被认为是人类。
1.3、类别
图形验证码:
这类验证码大多是计算机随机产生一个字符串,在把字符串增加噪点、干扰线、变形、重叠、不同颜色、扭曲组成一张图片来增加识别难度。
滑动验证码:
也叫行为验证码,比较流行的一种验证码,通过用户的操作行为来完成验证,其中最出名的就是极验。滑动验证码的原理就是使用机器学习中的深度学习技术,根据一些特征来区分是否为正常用户。通过记录用户的滑动速度,还有每一小段时间的瞬时速度,用户鼠标点击情况,以及滑动后的匹配程度来识别。而且,不是说滑动到正确位置就是验证通过,而是根据特征识别来区分是否为真用户,滑到正确位置只是一个必要条件。
点触验证码:
点击类验证码都是给出一张包含文字的图片,通过文字提醒用户点击图中相同字的位置进行验证。
二、Pillow库
2.1、PIL库和Pillow库
PIL库
PIL (Python Image Library) 已经算是 Python 处理图片的标准库了,兼具强大的功能和简洁的 API,但是PIL库的更新非常缓慢, 并且它只支持到python2.7,不支python3。
Pillow库
由于PIL库更新太慢了,于是一群志愿者在PIL库的基础上创建的分支版本,命名为Pillow.
Pillow目前最新支持到python3.6,它的维护和开发十分活跃,兼容PIL库的绝大多数语法,并且增加了许多新的特性,推荐直接使用Pillow
2.1.1、Pillow库安装
命令:
pip install pillow
2.1.2、PIL与Pillow使用注意
Pillow和PIL不能共存在一个环境中,如果你之前安装了PIL的话,需要删除掉才能在安装Pillow
由于是继承自PIL的分支, 所以Pillow库的导入是这样的:
Import PIL
2.2、图形基本概念
2.2.1、尺寸
图片尺寸(size)指的是图片的宽度和高度,通过size属性可以获取图片的尺寸,它的返回值是一个元组,元组里面有两个值,分别是水平和垂直方向上的像素个数。
代码示例:
from PIL import Image
img = Image.open('xxx.png') #参数:图片位置
print(img.size) #(xxx,xxx)
2.2.2、坐标系统
使用笛卡尔像素坐标系,x轴从左到右,y轴从上到下增长
2.2.3、通道
图片均是由一个或者多个数据通道构成。
RGB图像:每张图片都是由三个数据通道叠加构成,分别为R 、G 、B。
PNG图像:有RGBA四个通道,A代表透明度。
灰度图像(没有色彩的图片, RGB色彩分量全部相等):只有一个通道。
灰度指的是黑白图像中点的颜色深度,范围一般是0到255, 白色为255,黑色为0。
2.3、图像获取
- 从文件中加载图像
例:
from PIL import Image
img = Image.open('dog2.png') #open参数: 图片的位置
- 创建一个新的图像
例:
img =Image.new("RGB",(200,100),"red")
注意:这里的最后一个参数可以用ImageColor里面的colormap来获得更多初始化的颜色。
- 切割图片
函数:
Image.crop(left, up, right, below)
参数:
① left:与左边界的距离
② up:与上边界的距离
③ right:还是与左边界的距离
④ below:还是与上边界的距离
例:
from PIL import Image
img = Image.open('dog2.png')
w,h = img.size
# 准备将图片切割成9张小图片
weight = int(w // 3)
height = int(h // 3)
# 切割后的小图的宽度和高度
print(weight, height)
for j in range(3):
for i in range(3):
box = (weight * i, height * j, weight * (i + 1), height * (j + 1))
region = img.crop(box)
region.save('imgs/{}{}.png'.format(j, i))
结果:
2.4、获取图像通道
函数:getbands()
例:
from PIL import Image
img = Image.open('