【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 一起使用。
相关推荐
Csvn1 天前
🌟 LangChain 30 天保姆级教程 · Day 13|OutputParser 进阶!让 AI 输出自动转为结构化对象,并支持自动重试!
python·langchain
Wenweno0o1 天前
0基础Go语言Eino框架智能体实战-chatModel
开发语言·后端·golang
chenjingming6661 天前
jmeter线程组设置以及串行和并行设置
java·开发语言·jmeter
cch89181 天前
Python主流框架全解析
开发语言·python
不爱吃炸鸡柳1 天前
C++ STL list 超详细解析:从接口使用到模拟实现
开发语言·c++·list
十五年专注C++开发1 天前
RTTR: 一款MIT 协议开源的 C++ 运行时反射库
开发语言·c++·反射
Momentary_SixthSense1 天前
设计模式之工厂模式
java·开发语言·设计模式
sg_knight1 天前
设计模式实战:状态模式(State)
python·ui·设计模式·状态模式·state
好运的阿财1 天前
process 工具与子agent管理机制详解
网络·人工智能·python·程序人生·ai编程
‎ദ്ദിᵔ.˛.ᵔ₎1 天前
STL 栈 队列
开发语言·c++