PIL图片 指的是使用 PIL(Python Imaging Library) 或其升级版 Pillow 加载的图像对象。Pillow 是 PIL 的现代替代品,它是一个强大的 Python 图像处理库,广泛用于图像加载、处理和保存。
Pillow图片的基本概念
-
Pillow图片对象:
- Pillow 使用
PIL.Image
类表示图片。 - 使用
Image.open()
加载图片后,返回的就是一个PIL.Image
对象。
- Pillow 使用
-
图片数据的格式:
- Pillow 的图片对象并不是直接的
numpy
数组,而是一个抽象对象。 - 你可以将它转换为
numpy
数组进行进一步处理,或者从numpy
数组创建一个PIL.Image
对象。
- Pillow 的图片对象并不是直接的
Pillow图片的常见操作
以下是一些常见的操作以及代码示例:
1. 加载图片
使用 Image.open()
从本地加载图片。
python
from PIL import Image
# 加载图片
image = Image.open("path_to_image.jpg")
print("Image format:", image.format) # 图片格式,例如 JPEG, PNG
print("Image size:", image.size) # 图片尺寸 (宽, 高)
print("Image mode:", image.mode) # 图像模式,例如 RGB, RGBA, L
2. 显示图片
直接显示加载的图片(需要 GUI 环境)。
python
image.show()
3. 保存图片
将图片保存为不同格式的文件。
python
image.save("output_image.png")
4. 调整图片大小
改变图片的大小(使用 resize
)。
python
resized_image = image.resize((128, 128)) # 改变尺寸为 128x128
resized_image.show()
5. 将图片转换为灰度图
将图片从彩色模式(如 RGB
)转换为灰度模式(L
)。
python
gray_image = image.convert("L")
gray_image.show()
6. 裁剪图片
从图片中裁剪出一个区域。
python
box = (50, 50, 200, 200) # 裁剪区域 (左, 上, 右, 下)
cropped_image = image.crop(box)
cropped_image.show()
7. 将 Pillow
图片转为 NumPy 数组
通过 numpy.array()
方法将 Pillow
图片转换为 numpy
数组。
python
import numpy as np
image_array = np.array(image)
print("NumPy array shape:", image_array.shape) # 数组的形状 (高, 宽, 通道数)
8. 从 NumPy 数组创建 Pillow 图片
如果你已经有一个 numpy
数组,可以将其转换为 Pillow
图片。
python
new_image = Image.fromarray(image_array)
new_image.show()
Pillow图片的模式
Pillow 支持多种图像模式,常见模式包括:
- RGB:标准的三通道彩色图像。
- RGBA:带有透明度通道的彩色图像。
- L:灰度图像(单通道)。
- 1:二值图像(黑白)。
- CMYK:用于打印的颜色模型。
你可以通过 image.mode
查看图像的模式,并用 convert()
方法切换模式。
Pillow和OpenCV的区别
-
加载图片时的默认颜色通道:
- Pillow :默认使用
RGB
模式加载彩色图片。 - OpenCV :默认使用
BGR
模式加载彩色图片。
- Pillow :默认使用
-
数据类型:
- Pillow :返回
PIL.Image
对象,是高级封装的图片对象。 - OpenCV :返回
numpy.ndarray
,本质是底层像素数据数组。
- Pillow :返回
-
适用场景:
- Pillow:适合简单的图像处理任务(如加载、显示、保存、转换格式)。
- OpenCV:适合更复杂的计算机视觉任务(如图像检测、特征提取、视频处理)。
完整代码示例
以下是一个完整示例,演示如何加载、处理、保存并显示 Pillow 图片:
python
from PIL import Image
import numpy as np
# 加载图片
image = Image.open("path_to_image.jpg")
print("Original Image:")
print("Format:", image.format)
print("Size:", image.size)
print("Mode:", image.mode)
# 转换为灰度图像
gray_image = image.convert("L")
gray_image.show()
# 改变图片大小
resized_image = image.resize((128, 128))
resized_image.show()
# 转换为 NumPy 数组
image_array = np.array(resized_image)
print("Image as NumPy array:", image_array.shape)
# 从 NumPy 数组创建新图片
new_image = Image.fromarray(image_array)
new_image.show()
# 保存图片
new_image.save("output_image.png")
总结
- Pillow图片 是由
PIL.Image
类表示的图片对象,可以方便地进行加载、处理和保存。 - 它可以轻松转换为
numpy
数组,与机器学习和深度学习框架(如 PyTorch、TensorFlow)无缝集成。 - Pillow 是处理简单图像任务的首选,如果需要更复杂的功能,可以结合 OpenCV 一起使用。