【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 一起使用。
相关推荐
.又是新的一天.1 分钟前
03_JavaScript
开发语言·javascript·ecmascript
付出不多3 分钟前
python函数与模块
开发语言·python
樱花穿过千岛湖9 分钟前
第一章:Model Context Protocol (MCP)
网络·人工智能·python·网络协议·学习·tcp/ip
知识分享小能手14 分钟前
JavaScript学习教程,从入门到精通,XMLHttpRequest 与 Ajax 请求详解(25)
开发语言·javascript·学习·ajax·前端框架·css3·html5
其实你热情似火21 分钟前
Java基础第21天-正则表达式
java·开发语言·正则表达式
卡拉叽里呱啦29 分钟前
C#中异步的用法、原则和基本原理
开发语言·c#
wolf犭良31 分钟前
37、aiomysql实操习题
开发语言·python·算法
anqi2737 分钟前
Spark和Hadoop之间的对比和联系
大数据·开发语言·hadoop·spark
向哆哆42 分钟前
Java 加密与解密:从算法到应用的全面解析
java·开发语言·算法
划水哥~44 分钟前
Kotlin中实现静态
开发语言·kotlin