python PIL模块知识点

简介:Pillow是Python Imaging Library的简称,是Python语言中最为常用的图像处理库。Pillow库提供了对Python3的支持,为Python3解释器提供了图像处理的功能。通过使用Pillow库,可以方便地使用Python程序对图片进行处理,例如常见的尺寸、格式、色彩、旋转等处理。

1.Image打开显示模块

在Image模块中使用函数open()打开一幅图片,执行后返回Image类的实例。当文件不存在时,会引发IOError错误。使用函数open()语法格式如下所示:

open(fp,mode)

(1)fp:指打开文件的路径
(2)mode:可选参数,表示打开文件的方式,通常使用默认值r。

【示例】使用Image打开一幅图片

#导入Image模块
from PIL import Image
#打开图片
im = Image.open('图像路径名称')
im.show()
##查看图片的信息
print('图像格式:',im.format)
print('图像大小,格式是(宽度,高度):',im.size)
print('图像宽度:',im.width)
print('图像高度:',im.height)
print('读取坐标在(100,100)处的像素的信息:',im.getpixel((100,100))) ##以元祖的形式输入

2.Image完成图像混合

(1)透明度混合处理
在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原图片。
在Image模块中,可以使用函数new()新建图像。具体语法格式如下:

new(mode,size,color=0)

(1)mode:图片模式
(2)size:表示图片尺寸,是使用宽和高两个元素构成的元祖
(3)color:默认黑色

from PIL import Image
img1 = Image.open('图像路径名称').convert(mode="RGB")
img2 = Image.new("RGB",img1.size,"red")

##混合两幅图像
Image.blend(img1,img2,alpha=0.5).show()

(2)遮罩混合处理
在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三幅图片的尺寸相同。
【示例】遮罩混合图片

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()

3.图像的缩放、复制、剪切、粘贴

复制和缩放
(1)复制图像
在Pillow库的Image模块中,可以使用函数Image.copy()复制指定的图片,这可以用于在处理或粘贴时需要特有源图片。
(2)缩放像素
在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()

(3)缩放图像
在Pillow库的Image模块中,可以使用函数thumbnail()原生地缩放指定的图像。具体语法格式如下:

Image.thmbnail(size,resample=3)

【示例】缩放成指定的大小

from PIL import Image
img = Image.open('img2.jpg')
imgb = img.copy()
##缩放为指定大小(200,168)
imgb.thumbnail((200,168))
imgb.show()

粘贴和裁剪
(1)粘贴
在Pillow库的Image模块中,函数paste()的功能是粘贴源图像或像素至图像中。具体语法格式如下:

Image.paste(im,box=None,mask=None)

其中im是源或像素值;box是粘贴的区域;mask是遮罩。参数box可以分为以下3种情况。
1.(x1,y1):将源图像左上角对齐(x1,y1)点,其余超出被粘贴图像的区域被抛弃。
2.(x1,y1,x2,y2):源图像与此区域大小必须一致
3.None:源图像与被粘贴的图像大小必须一致。
(2)裁剪图像
在Pillow库的Image模块中,函数crop()的功能是剪切图片中box所指定的区域,具体语法如下:

Image.crop(box=None)

参数box是一个四元组,分别定义了剪切区域的左、上、右、下4个坐标
【示例】对指定图片剪切和粘贴操作

from PIL import Image
img = Image.open('图像所在位置')
##复制图片
imgb = img.copy()
imgc = img.copy()
#剪切图片
region = imgb.crop((5,5,120,120))
#粘贴图片
imgc.paste(region,(30,30))
imgc.show()

4.图像旋转、分离、合并

图像旋转
在Pillow库的Image模块中,函数rotate()的功能返回此图像的副本,围绕其中心逆时针旋转给定的度数。具体语法格式如下:

Image.rotate(angle,resample=0,expand=0,center=None,translate=None,fillcolor=None)

【示例】函数rotate()实现图像旋转

from PIL import Image
img = Image.open('图像路径名称')
img.rotate(90).show()  ##旋转90度

格式转换
(1)convert()
在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。
(2)transpose()
在Pillow库的Image模块中,函数transpose()函数功能是实现图像格式的转换。具体语法格式如下:

Image.transpose(method)

转换图像后,返回转换后的图像,“method”的取值有以下几个。
1.PIL.Image.FLIP_LEFT_RIGHT:左右镜像
2.PIL.Image.FLIP_TOP_BOTTOM:上下镜像
3.PIL.Image.ROTATE_180:旋转180
4.PIL.Image.ROTATE_90:旋转90
5.PIL.Image.ROTATE_270:旋转270
6.PIL.Image.TRANSPOSE:颠倒顺序

【示例】对指定图片进行转换操作

from PIL import Image
##打开指定的图片
img1 = Image.open('图片路径名称')
img2 = img1.copy()
##convert()
img_convert = img2.convert('CMYK')
##img.convert.show()
##transpose()
img_transpose = img2.transpose(Image.ROTATE_90)
img.transpose.show()

分离和合并
(1)分离
在Pillow库的Image模块中,使用函数split()可以将图片分割为多通道列表。使用函数split()的语法格式如下:

Image.split()

(2)合并
在Pillow库的Image模块中,使用函数merge()可以将一个通道的图像合并到更多通道图像中。使用函数merge()的语法格式如下所示:

Image.merge(mode,bands)

其中mode指输出图像的模式,bands波段通道,一个序列包含单个带图通道。

【示例】对指定图片进行合并和分离操作

from PIL import Image
img1 = Image.open('图片1的路径名称')
img2 = Image.open('图片2的路径名称')
img2 = img2.resize(img1.size)
r1,g1,b1 = img1.split()
r2,g2,b2 = img2.split()
tmp = [r1,g2,b1]
img = Image.merge("RGB",tmp)
img.show()

5.滤镜

在Pillow库中的Image模块中,使用函数 filter() 可以对指定的图片使用滤镜效果,在Pillow库中可以用的滤镜保存在 ImageFilter 模块中。使用函数**filter()**语法格式如下所示:

Image.filter(filter)

通过函数filter(),可以使用给定的滤镜过滤指定的图像,参数“filter”表示滤镜内核。

【示例】对指定图片实现滤镜模糊操作

from PIL import Image,ImageFilter
##使用函数filter()实现滤镜效果
img = Image.open('文件路径位置名称')
b = img.filter(ImageFilter.GaussianBlur)
b.show()

图像对比:

from PIL import Image,ImageFilter
img = Image.open('lean.jpg')
w,h = img.size
##创建一个图像
img_output = Image.new('RGB',(2*w,h))
img_output.paste(img,(0,0))
img_filter = img.filter(Imagefilter.GaussianBlur)
img_output.paste(img_filter,(w,0))
img_output.show()

除此之外,还可以用ImageFilter对指定图片细线滤镜特效

from PIL import Image,ImageFilter
img = Image.open('lean.jpg')
w,h = img.size
##创建一个图像
img_output = Image.new('RGB',(2*w,h))
img_output.paste(img,(0,0))

filters = []
img_filter1 = img.filter(ImageFilter.GaussianBlue) ##高斯滤镜
img_filter2 = img.filter(ImageFilter.EDGE_ENHANCE) ##边缘增强滤镜
img_filter3 = img.filter(ImageFilter.FIND_EDGES) ##寻找边缘滤镜

filters.append(img_filter1)
filters.append(img_filter2)
filters.append(img_filter3)

for img_filter in filters:
	img_output.paste(img_filter,(w,0))
	img_output.show()

6.图片合成

ImageChops模块
在Pillow库的内置模块ImageChops中包含了多个用于实现图片合成的函数。这些合成功能是通过计算通道中像素值的方式来实现的。其主要用于制作特效、合成图片等操作。
常用的内置函数如下:
(1)相加函数add(),功能是对两张图片进行算数假发运算。具体语法如下所示:

ImageChops.add(image1,image2;scale=1.0,offset=0)

在合成后图像中的每个像素值,是两幅图像对应像素值依据下面的公式进行计算得到的。

out = ((image1 + image2)/scale + offset)

【示例】使用add图片合成

from PIL import Image
from PIL import ImageChops
#打开图片
imga = Image.open('图片1路径名称')
imgb = Image.open('图片2路径名称')
##对两张图片进行算数加法运算
ImageChops.add(imga,imgb,1,0).show()

(2)减法函数 subtract() ,功能是对两张图片进行算数减法运算。具体语法如下所示:

ImageChops.subtract(image1,image2,scale=1.0,offset=0)

在合成后图像中的每个像素值,是两幅图像对应像素值依据下面的公式进行得到的

out = ((image1 - image2)/scale + offset)

【示例】使用subtract()图片合成

from PIL import Image
from PIL import ImageChops
##打开图片
imga = Image.open('图片1路径名称')
imgb = Image.open('图片2路径名称')
##对两张图片进行减法运算
ImageChops.subtract(imga,imgb,1.0).show()

(3)变暗函数 darker() ,功能是比较两个图片的像素,去两张图片中对应像素的较小值,所以合成时两幅图像中对应位置的暗部分得到保留,而去除亮部分。具体语法如下:

ImageChops.darker(image1,image2)

像素计算公式如下所示:

out = min(image1,image2)

【示例】使用darker()图片合成

from PIL import Image
from PIL import ImageChops
##打开图片
imga = Image.open('图片1路径名称')
imgb = Image.open('图片2路径名称')
##使用变量函数darker()
ImageChops.darker(imga,imgb).show()

(4)变凉函数 lighter() ,与变暗函数darker()相反,功能是比较两个图片(逐像素比较),返回一幅新的图片,这幅新的图片是将两张图片中较亮的部分叠加得到的。也就是说,在某一点上,两张图中哪个的值大(亮)则取之。具体语法如下所示:

ImageChops.lighter(image1,image2)

函数lighter()与函数darker()的功能相反,计算后得到的图像是两幅图对应位置的亮部分。
像素的计算公式如下所示:

out = max(image1,image2)

【示例】使用lighter()图片合成

from PIL import Image
from PIL import ImageChops
##打开图片
imga = Image.open('图片1路径名称')
imgb = Image.open('图片2路径名称')
##使用变亮函数lighter()
ImageChops.lighter(imga,imgb).show()

(5)叠加函数**multiply()**功能是将两张图片互相叠加。如果用纯黑色与某图片进行叠加操作,就会得到一幅纯黑色的图片。如果用纯白色与图片作叠加,则图片不熟影像。具体语法如下:

ImageChops.multiply(image1,image2)

合成的图像的效果类似两张图片在透明的描图纸上叠放在一起观看的效果。其对应像素的计算公式如下所示:

ImageChops.multiply(image1,image2)

合成的图像的效果类似两张图片在透明的描图纸上叠放在一起观看的效果。其对应像素的计算公式如下所示:

out = image1 * image2 / MAX

【示例】使用multiply()图片合成

from PIL import Image
from PIL import ImageChops
##打开图片
imga = Image.open('图片1路径名称')
imgb = Image.open('图片2路径名称')
##使用变亮函数lighter()
ImageChops.multiply(imga,imgb).show()

还有一些函数,这里就不在赘述了

7.调整图像色彩亮度

ImageEnhance模块
内置的ImageEnhance模块中包含了多个用于增强图像效果的函数,主要用来调整图像的色彩、对比度、亮度和清晰度等,感觉上和电视机的显示参数一样。
在模块ImageEnthance中,所有的图片增强对象都实现一个通用的接口。这个接口只包含如下一个方法。
方法**enhance()**会返回一个增强的Image对象,参数factor是一个大于0的浮点数,1表示范湖原始图片。
挡在Python程序中使用模块ImageEnhance增强图像效果时,需要首先创建对应的增强调整器,然后调用调整器输出函数,根据指定的增强系数(小于1表示减弱,大于1表示增强,等于1表示原图不变)进行调整,最后输出调整后的图像。
在模块ImageEnthance中,常用的内置函数如下所示:
(1)ImageEnhance.Color(image):功能是调整图像色彩平衡,相当于彩色电视机的对比度调整。
(2)ImageEnhance.Brightness(image):功能是调整图像亮度。
(3)ImageEnhance.Sharpness(image):功能是调整图像清晰度,用于锐化/钝化图片。
锐化操作的factor是0~2之间的一个浮点数。当factor=0时,返回一个模糊的图片对象;当factor=2时,返回一个锐化的图片对象;当factor=1时,返回原始图片对象。
【示例】使用ImageEnhance实现图像色彩平衡

from PIL import Image,ImageEnhance
##打开图像
img = Image.open('图片路径名称')
w,h = img.size
img_output = Image.new('RGB',(3*w,h))
#将原图复制到(0,0)
img_output.paste(img,(0,0))
##获取色彩调节器
img_color = ImageEnhance.Color(img)
imgb = img_color.enhance(1.5)
img_output.paste(imgb,(w,0))
##减弱色彩
imgc = img_color.enhance(0.3)
img_output.paste(imgc,(2*w,0))
img_output.show()

【示例】亮度调整

from PIL import Image
from PIL import ImageChops,ImageEnhance
##打开图片
imga = Image.open('文件路径名称')
w,h = imga.size
##创建图像区域
img,output = Image.new('RGB',(2*w,h))
##将创建的部分粘贴图片
img_output.paste(imga,(0,0))
##调整图像的亮度
nhb = ImageEnhance.Brightness(imga)
for ratio in [0.6,1.8]:
	b = nhb.enhance(ratio)##增强处理
	img_output.paste(b,(w,0)) ##粘贴修改后的图像
	img_output.show()

版权声明:本文为zx759174597原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。