Python图像处理-Pillow
Posted pywjh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python图像处理-Pillow相关的知识,希望对你有一定的参考价值。
什么是验证码?
验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写。
是一种用来区分用户是计算机还是人的公共全自动程序。
验证码的作用
认证码是一种人机识别手段,最终目的是区分正常用户和机器的操作。
可以防止:恶意破解密码、注册、刷票、论坛灌水,防止黑客对用户的密码进行暴力破解。
一般是提出一个问题,这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答这个的问题,所以回答出问题的用户就可以被认为是人类。
验证码的类别
验证码自面世以来就一直在更新,迭代。
图形验证码:这类验证码大多是计算机随机产生一个字符串,在把字符串增加噪点、干扰线、变形、重叠、不同颜色、扭曲组成一张图片来增加识别难度。
滑动验证码:也叫行为验证码,比较流行的一种验证码,通过用户的操作行为来完成验证,其中最出名的就是极验。
滑动验证码的原理就是使用机器学习中的深度学习技术,根据一些特征来区分是否为正常用户。通过记录用户的滑动速度,还有每一小段时间的瞬时速度,用户鼠标点击情况,以及滑动后的匹配程度来识别。而且,不是说滑动到正确位置就是验证通过,而是根据特征识别来区分是否为真用户,滑到正确位置只是一个必要条件。
点触验证码:点击类验证码都是给出一张包含文字的图片,通过文字提醒用户点击图中相同字的位置进行验证。
简介
Python传统的图像处理库PIL(Python Imaging Library),可以说基本上是Python处理图像的便准库,功能强大,使用简单。
但是由于PIL不支持Python3,而且更新缓慢。所以由志愿者在PIl的基础上创建了一个分支版本,命名为Pillow,Pillow目前最新支持到
Python3.6,更新活跃,并且增加了许多新的特性。所以在这里讲解一下Pillow库
安装
命令行pip安装
pip install Pillow
但是需要注意一点,Pillow和PIL是不能共存在一个环境中的,所以如果安装有PIL的话,需要先把PIL卸载掉,也不用担心更能问题,
Pillow具备PIL绝大多数的方法,卸载命令
pip uninstall PIL
由于是继承PIL的分支,所以Pillow的导入是这样的:
import PIL #或者是 from PIL import Image
使用手册
Image
Image是Pillow中最为重要的类,实现了Pillow中大部分的功能。要创建这个类的示例主要有三个方法:
1. 从文件加载图片
2. 处理其他图像获得
3. 创建一个新的图像
读取图像
一般来说,我们都是通过文件加载图像来实例化这个类,如下所示:
from PIl import Image picture = Image.open(\'test.png\')
如果没有指定图片格式的话,那么Pillow会自动识别文件内容为文件格式。
新建图像
Pillow新建空白图像使用new()方法,第一个参数是mode即颜色空间模式,第二个参数指定了五项的分辨率(宽x高),第三个参数是颜色。
- 可以直接填入常用的颜色的名称。如‘red\'。
- 也可以填入十六进制表示的颜色,如#F0000表示红色。
- 还能传入元组,比如(255,0,0,255)或者(255,0,0)表示红色。
picture = Image.new(\'RGB\', (200, 100), \'red\')
保存图片
保存图片的话需要使用save()方法:
picture.save(\'test.png\')
保存的时候,如果没有指定图片格式的话,那么Pillow会根据输入的后缀名决定保存的文件格式。
图像的坐标表示
- 在Pillow中,用的是图像左上角的坐标的原点(0,0).所以这意味着,x轴的数值是从左到右增长的,y轴的数值是从上到下增长的。
- 我们处理图像时,常常需要去表示一个矩形的图像区域。Pillow中很多的方法都需要传入一个表示矩形区域的元组参数。
-
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
图像的一些信息,为字典格式
常用方法
裁剪图片
croped_im = img.crop((50, 60, 400, 218))
原图片:
裁剪以后:
复制图像使用copy()
方法:
copyed_im = im.copy()
粘贴图像使用paste()
方法:
croped_im = im.crop((50, 60, 400, 218)) im.paste(croped_im, (0, 0))
im对象调用了paste()
方法,第一个参数是被裁剪下来用来粘贴的图像,第二个参数是一个位置参数元祖,这个位置参数是粘贴的图像的左顶点。
调整图像大小使用resize()
方法:
resized_im = im.resize((width, height))
resize()
方法会返回一个重设了大小的Image
对象。
或者使用thumbnail()方法:
im = Image.open(\'test.jpg\') #获得图像尺寸 w, h = im.size # 缩放到50% im.htumbnail((w//2, h//2)) #显示图片 im.show()
thumbnail()
方法可以用来制作缩略图。它接受一个二元数组作为缩略图的尺寸,然后将示例缩小到指定尺寸
旋转图像使用rotate()
方法,此方法按逆时针旋转,并返回一个新的Image
对象:
# 逆时针旋转90度 im.rotate(90) im.rotate(180) im.rotate(20, expand=True)
inn = img.rotate(90)
旋转的时候,会将图片超出边界的边角裁剪掉。如果加入expand=True
参数,就可以将图片边角保存住。
翻转图像使用transpose()
:
# 水平翻转 im.transpose(Image.FLIP_LEFT_RIGHT) # 垂直翻转 im.transpose(Image.FLIP_TOP_BOTTOM)
im.getbands()
通过通道分割图片
split()
split()
可以将多通道图片按通道分割为单通道图片。返回各个通道的灰度图组成的元组
R, G, B = im.split()
split()
方法返回的是一个元祖,元祖中的元素则是分割后的单个通道的图片。
getchannel(channel)
getchannel()
可以获取单个通道的图片:
R = im.getchannel("R")
模式转化
img = im.convert("L")
获取单个像素的值
使用getpixel
(xy)方法可以获取单个像素位置的值:
im.getpixel((100, 100))
传入的xy需要是一个元祖形式的坐标。
如果图片是多通道的,那么返回的是一个元祖。
L模式经常用来处理图像识别,数据方便分析处理
加载图片全部数据
我们可以使用load()
方法加载图片所有的数据,并比较方便的修改像素的值:
pixdata = im.load()
pixdata[100,200] = 255
此方法返回的是一个PIL.PyAccess
,可以通过这个类的索引来对指定坐标的像素点进行修改。
获取全部像素内容
getdata(band = None)
方法,用来获取 Image
类的对象中的像素内容
该方法会将图片中的像素内容,逐行逐行地拼接起来,作为一个完整的序列返回。方法的返回类型,是 PIL 库的内部类型。我们可以用 list(im.getdata())
得到标准的 Python list
对象。
band
意味「通道」。当 band = None
时,方法返回所有通道的像素内容;当 band = 0
时,则返回第一个通道的像素内容。例如,对于 RGB 模式的位图,band = 0
返回 R 通道的内容;band = 2
返回 B
通道的内容。
from PIL import Image im = Image.open(\'test.jpg\') print(im.getdata()) #获取所有通道的值 类似生成器的对象 print(list(im.getdata(0))) #获取第一个通道的值, 转化为列表
关闭图片并释放内存
此方法会删除图片对象并释放内存
im.close()
以上是关于Python图像处理-Pillow的主要内容,如果未能解决你的问题,请参考以下文章
Pillow 中重复使用crop 方法的问题(Python 的PIL fork)