【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 一起使用。
相关推荐
Juchecar1 小时前
解惑:NumPy 中 ndarray.ndim 到底是什么?
python
用户8356290780511 小时前
Python 删除 Excel 工作表中的空白行列
后端·python
Json_1 小时前
使用python-fastApi框架开发一个学校宿舍管理系统-前后端分离项目
后端·python·fastapi
数据智能老司机8 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机9 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机9 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机9 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i9 小时前
drf初步梳理
python·django
每日AI新事件9 小时前
python的异步函数
python
这里有鱼汤10 小时前
miniQMT下载历史行情数据太慢怎么办?一招提速10倍!
前端·python