python第三方库——pillow库

PIL:Python Imaging Library,已经是Python平台上的图像处理标准库了。PIL功能非常强大,但API却非常简单易用,因此广受开发人员的使用。它提供了广泛的文件格式支持、强大的图像处理能力、主要包括图像储存、图像显示、格式转换以及基本的图像处理操作等。

 pip install pillow

1、图像处理的基本知识

1.1图像的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)

1.2 像素阵列

像素(pixel,简写px):是数码感光元件上最小的感光单位,也是数字图片上最小的不可再分割的元素。例如,我们通常说的照片长1920、宽1080,是指横向1920个像素,纵向1080个像素(总计2073600个像素)。而每一个像素包含RGB三种颜色,也就是说1个像素包含3个字节的信息:(R,G,B) 。假如这个像素是红色,则信息是:(255,0,0)。那么,理论上我们只要操作每个点的这三个数字,就能够实现任何推行。一幅画上所有的像素点的信息就完全可以采用矩阵表示。通过矩阵的运算实现更加复杂的操作。

2、pillow使用

2.1 导入pillow库

Pillow库安装成功后,导包时要用PIL来导入,而不能用pillow或Pillow,导入相应的包:

 import PIL
 from PIL import image # 导入PIL第三方库中的image模块

在Pillow库中,有二十多个模块,还支持非常多的插件。其中最常用的是Image模块中同名的Image类,其他很多模块都是在Image模块的基础上对图像做进一步的特殊处理。

2.2 使用pillow库中的Image模块

Image类

  • 打开照片 Image.open(fp,mode=’r’),如果加载传给则会返回一个Image对象,fp是照片路径,mode是模式。图像的对象属性由:filename源文件的文件名或路径,format图片的格式,size图片大小,以像素为单位,mode照片模式,width图像宽度,height图片高度,palete调色板表等。

  • 新建图像 new(mode,sizemcolor=0):在Image模块中,可以使用new()新建图像。mode值图片模式。size表示图片尺寸,是使用宽和高两个元素构成元组。color默认颜色。

  • 保存照片 save(fp,format=None,* *params):保存图像到给定的文件名下,如果没有指定格式则可以使用文件扩展名来确定要使用的格式,无返回值。fp是文件名或路径,format可选的格式覆盖。

  • 显示照片 show():显示这个图像,这方法主要是调试目的。

1、基本操作

对原本的照片进行一些基本操作,获取该照片的信息,例如:照片格式,照片大小,打印照片等等基本操作。

 from PIl import Image           # 导入PIL库中的image模块
 img=Image.open('2045435.jpg') # 打开照片
 img.show() # 显示照片
 print('照片的格式:',img.format) # 输出:jpg 照片的格式是jpg
 print(img.size)
 # 输出:(1920,1080),以元组的形式进行展现,输出照片的长和宽,可以在后面增加[0]表示元组的第一个数
 print(img.height) # 输出:1080,只输出照片的长
 print(img.width) # 输出:1920,只输出照片的宽
 print('获取(100,100)处像素值:',img.getpixel((100,100))) #输出:(143, 163, 190)
 Image.new(mode='RGB',size=img.size,color=(255,0,0)).show() #新建一个和img一样大的红色照片

 

2、缩放照片

(1)thumbnail(size,resample=3):指定照片的像素,size是大小,resample是重采样滤波器,可以是Image。NEARST、Image.BILINEAR、Image.BICUBIC或者Image.LANCZOS,默认为image.BICUBIC。

 from PIL import Image           # 导入pillow库中的Image模块
 img=Image.open('2045435.jpg') # 打开照片
 print(img.size) # 输出:(1920, 1080) 原照片的大小
 img.thumbnail((300,300),resample=Image.BILINEAR)
 # 将照片缩小为300,300,需要注意的是照片还是按照比例缩小,但是以最长的那条边为基准
 print(img.size) # 输出:(300, 169) 缩小后照片的大小
 img.save('1.jpg') # 保存照片
 img.show() # 显示照片

(2)eval(image,fun):其中image表示输入的图片,fun表示给输入图片的每一个像素应用此函数,fun()函数只允许接受一个整型参数,,如果一个图片含有多个通道,则每个通道都会应用这个函数。

 from PIL import Image
 img=Image.open('2045435.jpg') # 打开照片
 Image.eval(img,lambad i :i*2).show() #所有像素值*2

缩放前后的照片对比

3、旋转照片

rotate(angle,resample=0,expand=0,center=None,translate=None):旋转图片的方向,返回旋转后的图像副本,一个Image对象。angle角度、逆时针旋转、resample从采样滤波器、expand是否展开、center旋转中心(坐标点)、translate旋转后。

旋转和翻转照片 transpose(method):旋转或翻转图像、返回旋转或者翻转后的图像副本,一个Image对象。method可以是Image.FLIP_LEFT_RIGHT(左右翻转)、Image.FLIP_TOP_BOTTOM(上下翻转)、Image.ROTATE_90、Image.ROTATE_180、Image.ROTATE_270、Image.TRANSPOSE或者Image.TRANSVERSE。

 from PIL import Image
 img=Image.open('2045435.jpg')
 print(img.size)
 img.show()
 img.rotate(90,fillcolor=None).resize((1000,1000)).show() # 将照片进行旋转90
 img.transpose(Image.FLIP_LEFT_RIGHT).resize((1000,1000))show() # 将照片左右互调位置

旋转照片如下

左右翻转照片如下

4、图片混合

blend(img1,img2,alpha):将两个照片进行混合,其中img1、img2值参与混合的图片1和图片2,alpha指混合透明度,取值是0-1.通过使用这个函数blend(),可以将两幅照片(相同的尺寸)以一定的透明度进行混合,混合的过程是(img1*(1-alpha)+img2 *aplha)。当混合透明度是0时,显示img1原图;混合透明度时1时,显示是img2原图。

 from PIL import Image
 img=Image.open('2045435.jpg') # 原照片
 img1=Image.new('RGB',size=img.size,color=(200,200,100))
 # 和原照片一样的长度的橙色图像
 img3=Image.blend(img,img1,alpha=0.3).show() # 两个相互结合

5、照片复制和粘贴、剪切

复制图片 Image.copy()

复制指定的图片,这样可以用于在处理或粘贴时需要持有的照片

 from PIL import Image
 img=Image.open('2045435.jpg')
 img2=img.copy().show() # 复制原照片

 粘贴图片 Image.paste():Image.paste(im,box=None,mask=None),其中im表示原图或者像素值;box表示粘贴的区域,若为(x1,y1)将原图左上角对齐(x1,y1)点,其他超出被粘贴图像的区域被抛弃。若为(x1,y1,x2,y2)原图和此区域一致。若为None,原图和被粘贴的照片大小一致。

剪切图片 Image.crop():

Image.crop(box=None),参数box时一个四元组,分别定义剪切区域的左、上、右、下四个坐标。

 from calendar import c
 from PIL import Image
 img=Image.open('2045435.jpg')
 img1=img.copy()         # 复制照片
 img2=img1.crop((100,100,200,500))        # 剪切照片
 img3=Image.new('RGB',[300,300],color=(0,225,225)) # 新建一个图像,400*400的白色图像
 img1.paste(img3,(200,200))  # 将img3的内容粘贴到img1上,从x=200和y=200开始粘贴
 img1.show()                 # 展现照片

6、图像像素的分离和合并

分离照片 Image.split()

使用split()函数可以将图片分割为多个通道列表(分解像素)

 合并照片 Image.merge()

使用merge()可以将一个通道的图像合并到更多通道图像。语法规则是Image.merge(mode,bands)。其中mode指输出图像的模式,bands表示涉及到的像素,一个序列包括单个带图通道。

 from PIL import Image
 img=Image.open(r"C:\Users\踩着上帝的小丑\Pictures\Saved Pictures\1.jpg")
 img2=Image.open(r"C:\Users\踩着上帝的小丑\Pictures\Saved Pictures\2045435.jpg").resize(img.size)
 # 需要将两张照片以同一个长宽标准
 R1,G1,B1=img.split() # split()将像素区分开来
 R2,G2,B2=img2.split()
 t=R2,G1,B2 # 重新组合像素,变为一个新的像素t
 img3=Image.merge('RGB',bands=t) # 合并像素,组成一张新的图像

2.3 使用pillow库中的ImageFilter模块

2.3.1 滤镜

在pillow库中的Image模块中,使用函数filter()可以对指定的图片使用滤镜效果,在pillow库中可以用的滤镜保存在ImageFilter模块中。

Image.Filter

调整滤镜 filter(filter):给图片增加滤镜、返回一个Image对象,filter是过滤器。

滤镜的种类 简写
模糊滤镜 BLUR
轮廓滤镜 CONTOUR
细节滤镜 DETAIL
边界增强滤镜 EDGE_ENHANCE
边界增强加强版滤镜 GE_ENHANCE_MORE
浮雕滤镜 EMBOSS
寻找边界滤镜 FUND_EDGES
平滑滤镜 SMOOTH
平滑滤镜加强版 SOOTH_MORE
锐化滤镜 SHARPEN
核滤镜 Kernel
等级滤波 RankFilter
最大值滤波 MaxFilter
最小值滤波 MinFilter
中值滤波滤镜 MedianFilter(size=3)
波形滤镜 ModeFilter
 from PIL import Image,ImageFilter       # 导入Image和ImageFilter模块
 img=Image.open('2045435.jpg') # 加载照片
 t=img.filter(ImageFilter.CONTOUR) # 将照片进行轮廓滤镜

2.4 使用pillow库中的ImageDraw模块

ImageDraw模块实现了绘图功能。可以通过图片的方式来绘制2D图像;还可以在原有的图片上进行绘图,以达到修饰图片进行注释的目的。

在ImageDraw模块绘图时需要首先创建一个ImageDraw.Draw对象,并且提供指向文件的参数,然后引用创建的Draw对象方法进行绘图,最后保存或者直接输出绘图的图像。

2.4.1 绘制直线

DrawObject.line([x1,y1,x2,y2],fill=None,width=0,joint=None)。其中以(x1,y1)为起始点,(x2,y2)为终点画一条直线。[x1,y1,x2,y2]也可以写为(x1,y1,x2,y2)或者[(x1,y1),(x2,y2)];fill表示设数字指定线条的颜色;width设置线条的宽度;joint表示一系列线之间的联合类型,可以时曲线。

2.4.2 图片写字

text(xy, text, fill, font, spacing, direction)

xy是文字左上角起始位置,text是待编辑文字,fill文字颜色。font是个ImageFont的实例,这个我们后面去讲,spacing是字体间距,direction参数是排列的方向,参数值有rtl,ttb两种。不好记?很好记,right to left, top to button。开头缩写而已。

 from PIL import Image,ImageDraw,ImageFont   
 # 调用ImageDraw模块进行增加文字,ImageFont模块进行中文处理
 img=Image.new('RGB',(200,200),'white')  # 创建一个白色背景的图像
 draw=ImageDraw.Draw(img)                # 新建一个类似画板
 draw.rectangle((50,50,150,150),fill='blue',outline='red')    
 # 画一个矩阵,从50*50到150*150,外部线条为红色,整体为蓝色
 font=ImageFont.truetype('simhei',20)              
 # 格式化处理,处理中文的不可译的影响      
 draw.text((70,70),text='张三',font=font,fill='white')
 # 在画布上写在内容,第一个参数时位置
 img.show()

 

 

 

 

版权声明:本文为zt123456原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zt123456/p/16128366.html