python第三方库——pillow库
作者:互联网
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()
标签:img,python,Image,第三方,照片,滤镜,图像,像素,pillow 来源: https://www.cnblogs.com/zt123456/p/16128366.html