一、PIL库简介
PIL (Python Imaging Library) 是 Python 编程语言下的一个图像处理库。它提供了许多图像处理功能,包括加载、保存、修改图像,以及对图像进行各种形式的处理和操作。PIL 库允许用户打开、操作和保存各种图像文件格式,包括常见的 JPEG、PNG、GIF 等格式。它还支持基本的图像处理操作,如调整大小、旋转、裁剪、改变图像的色彩等。PIL 库的一个重要特点是其简单易用的 API 接口。用户可以使用简单的函数调用来完成复杂的图像处理操作。此外,PIL 库还提供了丰富的文档和示例代码,方便用户学习和使用。
二、库安装
在 Python2 中,PIL (Python Imaging Library) 是一个非常好用的图像处理库,但PIL本身已经不再积极维护,但是它的一个分支,Pillow(PIL Fork),是完全兼容Python 3的。Pillow不仅支持Python 3,还提供了PIL的更新和维护,包括安全修复、性能改进和新功能。Pillow库继承了PIL的所有功能,并添加了一些新的特性,使其成为Python 3用户处理图像的首选库。
pip安装
pip install pillow
三、Image模块解析
3.1 导入模块
from PIL import Image
3.2 常用图像属性
3.2.1 总览
size | 图片尺寸,单位是像素,返回值是二元元组 |
palette | 调色板属性 |
format | 标识图像格式或来源,如果图片不是从文件读取,返回None |
mode | 图片色彩模式,“L”为灰度图像;“RGB”为真彩色图像;“CMYK”为出版图像 |
3.2.2 代码演示
from PIL import Image
img_path="img/30.jpg" #图片地址
img = Image.open(img_path)
print(img.format,img.size,img.mode)
运行结果:
3.3 常用方法
3.3.1 图像的读取和创建
3.3.1.1 总览
Image.open(img_path) | 加载图像 |
Image.new(mode,size,color) | 创建新图像 |
show() | 显示图像 |
3.3.1.2 代码演示
1、Image.open(img_path);show()
from PIL import Image
img_path ="img/30.jpg" #图片地址
img = Image.open(img_path)
img.show()
2、Image.new(mode,size,color)
img = Image.new("RGB",(100,100),(255,255,255))
print(img.format,img.size,img.mode)
3.3.2 图像的保存
3.3.2.1 总览
save("filename.format") | 保存图像 |
3.3.2.2 代码演示
save("filename.format")
img = Image.new("RGB",(100,100),(255,255,255))
img.save("2.png")
img = Image.open("2.png")
print(img.format,img.size,img.mode)
运行结果:
3.3.3 图像的转换
3.3.3.1 总览
convert(mode) | 转换图像为不同的颜色模式 |
rotate(angle,expand) | 参数 expand 是一个布尔值,用于指定旋转操作是否应该扩展图像的画布(即图像的大小)以适应旋转后的整个图像 当 expand 设置为 True 时,画布将增大到足以容纳旋转后的图像。这可能会导致图像的某些部分被背景颜色填充,以确保整个图像都能被看到 当 expand 设置为 False 或者不设置时(默认值),旋转将保持原始图像的画布大小不变,这可能会导致图像的某些部分被裁剪掉 |
resize(new_size,resample) | 按size调整图像大小,返回副本 |
3.3.3.2 代码演示
1、convert(mode)
from PIL import Image
img_path="img/30.jpg" #图片地址
ori_img = Image.open(img_path) #加载原始图像
gray_img = ori_img.convert("L") #转换为灰度图像
gray_img.save("3.jpg") #保存为新图片
gray_img = Image.open("3.jpg") #加载保存的图片
print(gray_img.format,gray_img.size,gray_img.mode)
gray_img.show()
运行结果:
2、rotate(angle,expand)
from PIL import Image
# 打开一个现有的图像文件
img_path = "img/30.jpg" # 图像路径
original_image = Image.open(img_path)
# 显示原始图像
print("Original image:")
original_image.show()
# 旋转图像45度
rotated_image = original_image.rotate(180, expand=False)
# 显示旋转后的图像
print("Image rotated 45 degrees:")
rotated_image.show()
3、resize(new_size,resample)
resample | ||
Image.Resampling.NEAREST | 最近邻插值 | 速度最快,但可能会产生混叠和锯齿效果 适用于像素艺术或当速度比质量更重要时 |
Image.Resampling.BILINEAR | 双线性插值 | 在每个像素点的周围2x2区域内进行线性插值 比最近邻插值更平滑,但仍然可能产生混叠 |
Image.Resampling.BILINEAR | 三次样条插值 | 在每个像素点的周围4x4区域内进行平滑插值 比双线性插值更平滑,适用于大多数图像缩放任务 |
Image.Resampling.LANCZOS | 拉普拉斯插值 | 使用Lanczos窗口的正弦型插值,通常用于图像的下采样 比三次样条插值更平滑,但计算量更大 |
Image.Resampling.HAMMING | 汉明窗口插值 | 适用于图像的下采样,比Lanczos插值简单 |
Image.Resampling.BOX | 盒式滤镜 | 盒式滤镜的工作原理是将周围像素的值取平均 当用于下采样时,它计算新像素值时只考虑当前像素和周围像素的值, 这可能导致结果图像的边缘出现明显的阶梯状效果,但它实现简单且速度较快 |
from PIL import Image
# 打开一个现有的图像文件
img_path = "img/30.jpg"
original_image = Image.open(img_path)
original_image.show()
# 设置新的尺寸
new_size = (200, 200)
new_image = original_image.resize(new_size,Image.Resampling.LANCZOS)
new_image.show()
3.3.4 图像的处理
3.3.4.1 总览
getbands() | 返回一个包含图像每个波段名称的元组 | |
getcolors() | 返回图像中使用的颜色列表 | |
getchannel() | 返回包含源图像的单个通道的图像 'R'、'G'、'B'、'A' | 只适用于多波段图像,如RGB或RGBA图像。 如果在灰度图像(如'L'模式)上使用它, 将会抛出一个错误,因为灰度图像只有一个波段 |
split() | 提取图像的每个通道,返回图像副本 | |
Image.merge(mode,bands) | 合并通道 |
3.3.4.2 代码演示
1、getbands()
from PIL import Image
# 打开一个现有的图像文件
img_path = "3.jpg"
img = Image.open(img_path)
bands = img.getbands()
print(bands)
运行结果:
from PIL import Image
# 打开一个现有的图像文件
img_path = "img/30.jpg"
img = Image.open(img_path)
bands = img.getbands()
print(bands)
运行结果:
2、getcolors(maxcolors)
maxcolors 不填默认256,可根据实际情况修改
from PIL import Image
# 打开一个现有的图像文件
img_path = "img/30.jpg"
img = Image.open(img_path)
colors = img.getcolors(maxcolors=10000000)
print(colors)
运行结果:
from PIL import Image
# 打开一个现有的图像文件
img_path = "1.jpg"
img = Image.open(img_path)
colors = img.getcolors()
print(colors)
运行结果:
3、getchannel()
from PIL import Image
# 打开一个现有的图像文件
img_path = "1.jpg"
img = Image.open(img_path)
channel = img.getchannel('R')
print(channel)
运行结果:
channel = img.getchannel('B')
运行结果:
4、split()
from PIL import Image
# 打开一个现有的图像文件
img_path = "img/30.jpg"
img = Image.open(img_path)
bands = img.getbands()
print(bands)
r, g, b = img.split()
print(r)
r.show()
print(g)
g.show()
print(b)
b.show()
运行结果:
5、Image.merge(mode,band)
from PIL import Image
# 打开一个现有的图像文件
img_path = "img/OIP-C.jpg"
img = Image.open(img_path)
r, g, b = img.split()
new_img = Image.merge("RGB",(b,r,g))
new_img.show()
原图像:
运行结果(重新融合后):