【Python】Pillow图片简介及操作

PIL图片 指的是使用 PIL(Python Imaging Library) 或其升级版 Pillow 加载的图像对象。Pillow 是 PIL 的现代替代品,它是一个强大的 Python 图像处理库,广泛用于图像加载、处理和保存。


Pillow图片的基本概念

  1. Pillow图片对象

    • Pillow 使用 PIL.Image 类表示图片。
    • 使用 Image.open() 加载图片后,返回的就是一个 PIL.Image 对象。
  2. 图片数据的格式

    • Pillow 的图片对象并不是直接的 numpy 数组,而是一个抽象对象。
    • 你可以将它转换为 numpy 数组进行进一步处理,或者从 numpy 数组创建一个 PIL.Image 对象。

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的区别

  1. 加载图片时的默认颜色通道

    • Pillow :默认使用 RGB 模式加载彩色图片。
    • OpenCV :默认使用 BGR 模式加载彩色图片。
  2. 数据类型

    • Pillow :返回 PIL.Image 对象,是高级封装的图片对象。
    • OpenCV :返回 numpy.ndarray,本质是底层像素数据数组。
  3. 适用场景

    • 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 一起使用。
相关推荐
Learn-Python20 小时前
MongoDB-only方法
python·sql
ghie909020 小时前
基于MATLAB GUI的伏安法测电阻实现方案
开发语言·matlab·电阻
Gao_xu_sheng20 小时前
Inno Setup(专业安装/更新 EXE)
开发语言
小途软件21 小时前
用于机器人电池电量预测的Sarsa强化学习混合集成方法
java·人工智能·pytorch·python·深度学习·语言模型
吴声子夜歌21 小时前
Java数据结构与算法——基本数学问题
java·开发语言·windows
扫地的小何尚21 小时前
NVIDIA RTX PC开源AI工具升级:加速LLM和扩散模型的性能革命
人工智能·python·算法·开源·nvidia·1024程序员节
wanglei2007081 天前
生产者消费者
开发语言·python
清水白石0081 天前
《从零到进阶:Pydantic v1 与 v2 的核心差异与零成本校验实现原理》
数据库·python
leo__5201 天前
基于菲涅耳衍射积分的空心高斯光束传输数值模拟(MATLAB实现)
开发语言·matlab
昵称已被吞噬~‘(*@﹏@*)’~1 天前
【RL+空战】学习记录03:基于JSBSim构造简易空空导弹模型,并结合python接口调用测试
开发语言·人工智能·python·学习·深度强化学习·jsbsim·空战