【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 一起使用。
相关推荐
じ☆ve 清风°1 小时前
JavaScript 原型与原型链:深入理解 __proto__ 和 prototype 的由来与关系
开发语言·javascript·原型模式
程序员的世界你不懂5 小时前
Appium+python自动化(八)- 认识Appium- 下章
python·appium·自动化
_r0bin_5 小时前
前端面试准备-7
开发语言·前端·javascript·fetch·跨域·class
zhang98800005 小时前
JavaScript 核心原理深度解析-不停留于表面的VUE等的使用!
开发语言·javascript·vue.js
恸流失5 小时前
DJango项目
后端·python·django
Julyyyyyyyyyyy6 小时前
【软件测试】web自动化:Pycharm+Selenium+Firefox(一)
python·selenium·pycharm·自动化
Fanxt_Ja7 小时前
【JVM】三色标记法原理
java·开发语言·jvm·算法
蓝婷儿7 小时前
6个月Python学习计划 Day 15 - 函数式编程、高阶函数、生成器/迭代器
开发语言·python·学习
love530love7 小时前
【笔记】在 MSYS2(MINGW64)中正确安装 Rust
运维·开发语言·人工智能·windows·笔记·python·rust
水银嘻嘻8 小时前
05 APP 自动化- Appium 单点触控& 多点触控
python·appium·自动化