Pillow图像处理
Pillow 是Python Imaging Library 的简称,是Python 语言中最为常用的图像处理库。Pillow 库提供了对 Python3 的支持,为 Python3 解释器提供了图像处理的功能。通过使用 Pillow 库, 可以方便地使用 Python 程序对图片进行处理,例如常见的尺寸、格式、色彩、旋转等处理。
Pillow 库的安装
Pillow 库是 Python 开发者最为常见的图像处理库,它提供了广泛的文件格式支持、强大的图像处理能力,主要包括图像存储、图像显示、格式转换以及基本的图像处理操作等。 安装 Pillow 库的方法与安装 Python 其他第三方库的方法相同,也可以到 Python 官方网站下载 Pillow 库的压缩包。
pip 安装 pillow,执行如下命令:
pip install pillow
图象处理基本知识
图像的RGB 色彩模式
RGB 三个颜色通道的变化和叠加得到各种颜色,其中
- R 红色,取值范围,0-255
- G 绿色,取值范围,0-255
- B 蓝色,取值范围,0-255
比如,我们常见的黄色就是由红色和绿色叠加而来。
- 红色的 RGB 表示(255,0,0)
- 绿色的 RGB 表示(0,255,0)
- 蓝色的 RGB 表示(0,0,255)
- 黄色的 RGB 表示(255,255,0)
像素阵列
数字图像可以看成一个整数阵列,阵列中的元素称为像素(Pixel),见下图的数字阵列
每个点代表 1 个像素(Pixel),一个点包含 RGB 三种颜色。也就是 1 个像素包含 3 个字节的信息:(R,G,B)。假如这个像素是红色,则信息是:(255,0,0)。那么,理论上我们只要操作每个点上的这三个数字,就能实现任何的图形。一幅图像上的所有像素点的信息就完全可以采用矩阵来表示,通过矩阵的运算实现更加复杂的操作。
Image 模块
打开和新建
在 Pillow 库中,通过使用 Image 模块,可以从文件中加载图像,或者处理其他图像, 或者从 scratch 中创建图像。在对图像进行处理时,首先需要打开要处理的图片。在 Image 模块中使用函数 open()打开一副图片,执行后返回 Image 类的实例。当文件不存在时,会引发 IOError 错误。使用函数 open()语法格式如下所示。
open(fp,mode)
- fp:指打开文件的路径。
- mode:可选参数,表示打开文件的方式,通常使用默认值 r。
在 Image 模块中,可以使用函数 new()新建图像。具体语法格式如下所示:
new(mode,size,color=0)
(1) mode:图片模式,具体取值如下表
(2) size:表示图片尺寸,是使用宽和高两个元素构成的元组
(3) color:默认颜色(黑色)
Pillow 库支持的常用图片模式信息
mode(模式) | bands(通道) | 说明 |
---|---|---|
“1” | 1 | 数字 1,表示黑白二值图像,每个像素用 0 或者 1 共 1 位二进制代码表示 |
“L” | 1 | 灰度图,每个像素用 8 位二进制代码表示 |
“P” | 1 | 索引图,每个像素用 8 位二进制代码表示 |
“RGB” | 3 | 24 位真彩图,每个像素用 3 个字节的二进制代码表示 |
“RGBA” | 4 | “RGB”+透明通道表示,每个像素用 4 字节的二进制代码表示 |
“CMYK” | 4 | 印刷模式图像,每个像素用 4 字节的二进制代码表示 |
“YCbCr” | 3 | 彩色视频颜色隔离模式,每个像素用 3 个字节的二进制代码表示 |
“LAB” | 3 | lab 颜色空间,每个像素用 3 字节的二进制代码表示 |
“HSV” | 3 | 每个像素用 3 字节的二进制代码表示 |
“I” | 1 | 使用整数形式表示像素,每个像素用 4 字节的二进制代码表示 |
“F” | 1 | 使用浮点数形式表示像素,每个像素用 4 字节的二进制代码表示 |
【示例】使用 Image 打开一副图片
#导入 Image 模块
from PIL import Image
#打开图片
im=Image.open('bjsxt.png')
#显示图片
im.show()
#查看图片的信息
print('图像格式:',im.format)
print('图像大小,格式是(宽度,高度):',im.size) print('图像宽度:',im.width,'图像高度:',im.height)
运行结果如下图:
混合
透明度混合处理
在 Pillow 库的 Image 模块中,可以使用函数 blend()实现透明度混合处理。具体语法格式如下所示:
blend(im1,im2,alpha)
其中 im1、im2 指参与混合的图片 1 和图片 2,alpha 指混合透明度,取值是 0-1。通过使用函数 blend(),可以将 im1 和 im2 这两幅图片(尺寸相同)以一定的透明度进行混合。具体混合过程如下:
(im1*(1-alpha)+im2*alpha)
当混合透明度为 0 时,显示 im1 原图。当混合透明度 alpha 取值为 1 时,显示 im2
原图片。
【示例】透明度混合图片
from PIL import Image
img1=Image.open('bjsxt.jpg').convert(mode="RGB")
img2=Image.new("RGB",img1.size,"red")
# #混合两幅图
Image.blend(img1,img2,alpha=0.5).show()
执行结果如下图:
遮罩混合处理
在 Pillow 库中 Image 模块中,可以使用函数 composite()实现遮罩混合处理。具体语法格式如下所示:
composite(im1,im2,mask)
其中 im1 和 im2 表示混合处理的图片 1 和图片 2.mask 也是一个图像,mode 可以为“1”, “L”, or “RGBA”,并且大小要和 im1、im2 一样。
函数 composite()的功能是使用 mask 来混合图片 im1 和 im2,并且要求 mask、im1 和 im2 三幅图片的尺寸相同。下面的实例代码演示了使用 Image 模块实现图片遮罩混合处理的过程。
【示例】遮罩混合图片
from PIL import Image
img1=Image.open('img1.jpg')
img2=Image.open('img2.jpg')
img2=img2.resize(img1.size)
r,g,b=img2.split()
Image.composite(img2,img1,b).show()
执行结果如下图:
复制和缩放
复制图像
在 Pillow 库的 Image 模块中,可以使用函数 Image.copy()复制指定的图片,这可以用于在处理或粘贴时需要持有源图片。
缩放像素
在 Pillow 库的 Image 模块中,可以使用函数 eval()实现像素缩放处理,能够使用函数 fun()计算输入图片的每个像素并返回。使用函数 eval()语法格式如下:
eval(image,fun)
其中 image 表示输入的图片,fun 表示给输入图片的每个像素应用此函数,fun()函数只允许接收一个整型参数。如果一个图片含有多个通道,则每个通道都会应用这个函数。
【示例】缩放指定的图片,实现图像每个像素值×2
from PIL import Image
img=Image.open('img2.jpg')
Image.eval(img,lambda i:i*2).show()
缩放图像
在 Pillow 库的 Image 模块中,可以使用函数 thumbnail()原生地缩放指定的图像 。具体语法格式如下:
Image.thmbnail(size,resample=3)
【示例】缩放成指定的大小
from PIL import Image
img=Image.open('img2.jpg')
imgb=img.copy()
#缩放为指定大小(220,168)
imgb.thumbnail((220,168))
imgb.show()
粘贴和裁剪
粘贴
在 Pillow 库的 Image 模块中,函数 paste()的功能是粘贴源图像或像素至该图像中。具体语法格式如下:
Image.paste(im,box=None,mask=None)
其中 im 是源图或像素值;box 是粘贴的区域;mask 是遮罩。参数 box 可以分为以下 3 中情况。
- (x1,y1):将源图像左上角对齐(x1,y1)点,其余超出被粘贴图像的区域被抛弃。
- (x1,y1,x2,y2):源图像与此区域必须一致。
- None:源图像与被粘贴的图像大小必须一致。
裁剪图像
在 Pillow 库的 Image 模块中,函数 crop()的功能是剪切图片中 box 所指定的区域, 具体语法如下:
Image.crop(box=None)
参数 box 是一个四元组,分别定义了剪切区域的左、上、右、下 4 个坐标。
【示例】对指定图片剪切和粘贴操作
from PIL import Image
img=Image.open('bjsxt.png')
# 复制图片
imgb=img.copy()
imgc=img.copy()
# 剪切图片
region=imgb.crop((5,5,120,120))
#粘贴图片
imgc.paste(region,(30,30))
imgc.show()
图像旋转
在 Pillow 库的 Image 模块中,函数 rotate()的功能返回此图像的副本,围绕其中心逆时针旋转给定的度数。具体语法格式如下:
Image.rotate(angle,resample = 0,expand = 0,center = None,translate = None,fillcolor= None )
【示例】函数 rotate()实现图像旋转
from PIL import Image
img=Image.open('bjsxt.png')
img.rotate(90).show()
格式转换
covert()
在 Pillow 库的 Image 模块中,函数 convert()的功能是返回模式转换后的图像实例。具体转换的语法格式如下:
Image.convert(mode=None,matrix=None,dither=None,palette=0,colors=256)
其中 mode:转换文件的模式,默契支持的模式有“L”、“RGB”“CMYK”;matrix:转使用的矩阵;dither:取值为 None 切转为黑白图时非 0(1-255)像素均为白,也可以设置此参数为 FLOYDSTEINBERG。
transpose()
在 Pillow 库的 Image 模块中,函数 transpose()函数功能是实现图像格式的转换。具体语法格式如下:
Image.transpose(method)
转换图像后,返回转换后的图像,“method”的取值有以下几个。
-
PIL.Image.FLIP_LEFT_RIGHT:左右镜像
-
PIL.Image.FLIP_TOP_BOTTOM :上下镜像
-
PIL.Image.ROTATE_90:旋转 90
-
PIL.Image.ROTATE_180:旋转 180
-
PIL.Image.ROTATE_270:旋转 270
-
PIL.Image.TRANSPOSE :颠倒顺序
【示例】对指定图片进行转换操作
from PIL import Image
#打开指定的图片
img1=Image.open('bjsxt.png')
img2=img1.copy()
#convert()
img_convert=img2.convert('CMYK')
# img_convert.show()
#transpose()
img_transpose=img2.transpose(Image.ROTATE_90)
img_transpose.show()
分离和合并
分离
在 Pillow 库的 Image 模块中,使用函数 split()可以将图片分割为多个通道列表。使用函数 split()的语法格式如下所示:
Image.split()
合并
在 Pillow 库的 Image 模块中,使用函数 merge()可以将一个通道的图像合并到更多通道图像中。使用函数 merge()的语法格式如下所示:
Image.merge(mode,bands)
其中 mode 指输出图像的模式,bands 波段通道,一个序列包含单个带图通道。
【示例】对指定图片进行合并和分离操作
from PIL import Image
img1=Image.open('blend1.jpg'