PIL库中的子模块Image的功能和用法

一、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'
只适用于多波段图像,如RGBRGBA图像。
如果在灰度图像(如'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()

原图像:

运行结果(重新融合后):

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值