Python 图像处理利器:Pillow 深度详解与实战应用
一、前言:为什么选择 Pillow?
在 Python 的图像处理世界里,Pillow 是最经典、最实用、也是最常用的基础库之一。
它是 Python Imaging Library (PIL) 的一个分支,经过多年更新与维护,如今已经成为 Python 图像处理的事实标准。
Pillow 能够完成从基础到高级的几乎所有图像任务:
- 打开、显示、保存各种图像格式(JPEG、PNG、BMP、TIFF 等)
- 进行图像的缩放、裁剪、旋转、翻转、滤镜和增强
- 添加文字、水印、几何图形
- 批量图像处理
- 与 NumPy、OpenCV、TensorFlow 等配合做 AI 图像预处理
本文将系统介绍 Pillow 的功能、核心模块、使用技巧与进阶实践。
无论你是初学者,还是图像算法工程师,都能从中获得启发。
二、安装与快速上手
1. 安装 Pillow
在大多数 Python 环境中,Pillow 可以直接通过 pip 安装:
pip install pillow
验证是否安装成功:
from PIL import Image
print(Image.__version__)
如果能正常输出版本号,例如 10.2.0,说明 Pillow 已正确安装。
2. 快速体验
我们从一个最简单的例子开始,打开并显示一张图片:
from PIL import Image# 打开图像
img = Image.open("example.jpg")# 显示图像
img.show()# 保存为另一种格式
img.save("example_converted.png")
是不是很简单?
仅几行代码,你就能完成打开、显示、格式转换等操作。
三、图像的基础操作
1. 图像的属性
Pillow 的 Image 对象包含了大量信息:
img = Image.open("example.jpg")
print(img.format) # 图像格式,如 JPEG
print(img.size) # (宽, 高)
print(img.mode) # 模式,如 RGB、RGBA、L、CMYK
常见模式说明:
| 模式 | 含义 | 通道数 |
|---|---|---|
| 1 | 黑白(二值) | 1 |
| L | 灰度图像 | 1 |
| RGB | 彩色图像 | 3 |
| RGBA | 含透明度通道的彩色图像 | 4 |
| CMYK | 印刷常用颜色空间 | 4 |
2. 图像的裁剪与缩放
(1)裁剪
box = (100, 100, 400, 400)
region = img.crop(box)
region.show()
box 表示左上角和右下角的坐标 (left, upper, right, lower)。
(2)缩放
resized = img.resize((200, 200))
resized.show()
可以选择不同的插值算法:
from PIL import Imageimg.resize((200, 200), Image.Resampling.LANCZOS)
3. 旋转与翻转
# 顺时针旋转45度
rotated = img.rotate(45)# 水平翻转
flipped = img.transpose(Image.FLIP_LEFT_RIGHT)# 垂直翻转
flipped_v = img.transpose(Image.FLIP_TOP_BOTTOM)
4. 颜色模式转换
gray = img.convert("L") # 转灰度
rgba = img.convert("RGBA")
常用于人脸检测、OCR 前的预处理。
四、像素级操作
Pillow 允许直接访问像素进行操作。
1. getpixel() 与 putpixel()
r, g, b = img.getpixel((10, 10))
print(r, g, b)img.putpixel((10, 10), (255, 0, 0))
可用于修改单个像素、绘制特定形状。
2. 使用 NumPy 操作像素
与 NumPy 结合可以极大提高效率:
import numpy as np
from PIL import Imageimg = Image.open("example.jpg")
arr = np.array(img)# 反转颜色
arr = 255 - arrImage.fromarray(arr).show()
NumPy 让 Pillow 具备了更高的灵活性,常用于 AI 模型前的图像预处理。
五、图像增强与滤镜
Pillow 提供了多个增强模块,可提升图像质量或增加特效。
1. 图像增强模块
from PIL import ImageEnhanceenhancer = ImageEnhance.Brightness(img)
bright = enhancer.enhance(1.5) # 提亮 50%
bright.show()
常见增强类型:
| 模块 | 功能 |
|---|---|
| ImageEnhance.Brightness | 亮度 |
| ImageEnhance.Contrast | 对比度 |
| ImageEnhance.Color | 饱和度 |
| ImageEnhance.Sharpness | 锐度 |
例如:
ImageEnhance.Contrast(img).enhance(2.0).show()
2. 图像滤镜
Pillow 提供了丰富的滤镜功能:
from PIL import ImageFilter# 模糊
blurred = img.filter(ImageFilter.BLUR)# 边缘增强
edge = img.filter(ImageFilter.EDGE_ENHANCE)# 轮廓
contour = img.filter(ImageFilter.CONTOUR)
其他常用滤镜包括:
ImageFilter.SHARPEN:锐化ImageFilter.EMBOSS:浮雕ImageFilter.FIND_EDGES:边缘检测ImageFilter.SMOOTH:平滑
六、绘图与文字处理
Pillow 自带 ImageDraw 模块,可以在图片上绘制文字与几何图形。
1. 绘制几何图形
from PIL import ImageDrawdraw = ImageDraw.Draw(img)draw.rectangle((50, 50, 200, 200), outline="red", width=3)
draw.ellipse((100, 100, 180, 180), fill="blue")
draw.line((0, 0, 300, 300), fill="green", width=2)
2. 绘制文字
from PIL import ImageFont, ImageDrawfont = ImageFont.truetype("arial.ttf", 36)
draw = ImageDraw.Draw(img)
draw.text((50, 50), "Hello Pillow!", fill="yellow", font=font)
img.show()
可以用于生成水印、验证码、封面图等。
七、图像通道与混合
1. 通道拆分与合并
r, g, b = img.split()
merged = Image.merge("RGB", (r, g, b))
可以单独调整某个通道的亮度或对比度。
2. 图像混合与透明度控制
from PIL import Imageimg1 = Image.open("a.jpg")
img2 = Image.open("b.jpg").resize(img1.size)blended = Image.blend(img1, img2, alpha=0.5)
blended.show()
八、图像格式与批处理
1. 图像格式转换
Pillow 支持大量格式(JPEG、PNG、BMP、TIFF、ICO、WEBP 等):
img.save("output.webp", "WEBP", quality=90)
2. 批量处理示例
下面的脚本能自动遍历文件夹中的所有图片并压缩尺寸:
import os
from PIL import Imagedef batch_resize(input_dir, output_dir, size=(512, 512)):os.makedirs(output_dir, exist_ok=True)for file in os.listdir(input_dir):if file.endswith(('.jpg', '.png')):path = os.path.join(input_dir, file)img = Image.open(path)img = img.resize(size)img.save(os.path.join(output_dir, file))print("✅ 批量处理完成!")batch_resize("images", "resized")
九、高级技巧与性能优化
1. 懒加载机制
Image.open() 实际上不会立即读取所有像素,而是延迟加载,直到需要时才读取。
img = Image.open("large.jpg")
print(img.size) # 不会立即加载整个文件
这能有效节省内存。
2. 压缩与节省空间
img.save("compressed.jpg", quality=70, optimize=True)
quality控制压缩率(1–95)optimize自动优化存储结构
3. 缓存优化
在批量处理中,可以启用线程池或使用 Image.thumbnail() 自动生成缩略图:
img.thumbnail((300, 300))
相比 resize(),thumbnail() 会保持纵横比,并在原地修改。
十、Pillow + AI 图像预处理
在 AI 模型训练前,图像预处理是关键环节。
Pillow 与 NumPy 结合,可以轻松完成:
from PIL import Image
import numpy as npdef preprocess_image(path):img = Image.open(path).convert("RGB").resize((224, 224))arr = np.array(img) / 255.0return arr
配合 PyTorch 或 TensorFlow:
import torch
tensor = torch.tensor(preprocess_image("cat.jpg")).permute(2, 0, 1).unsqueeze(0)
十一、Pillow 在项目中的应用场景
- Web 后端图像服务:用户头像上传、压缩、裁剪。
- 数据增强:用于机器学习模型的训练样本扩展。
- 图像内容生成:自动化生成海报、证件照、表情包。
- OCR 预处理:文字识别前的灰度化、二值化。
- 视频帧处理:结合 OpenCV 对视频帧进行逐帧处理。
十二、实战案例:自动生成带水印的缩略图
from PIL import Image, ImageDraw, ImageFont
import osdef watermark_and_resize(input_path, output_path, watermark_text="© MySite"):img = Image.open(input_path).convert("RGBA")img.thumbnail((400, 400))watermark = Image.new("RGBA", img.size, (0,0,0,0))draw = ImageDraw.Draw(watermark)font = ImageFont.truetype("arial.ttf", 20)draw.text((10, img.size[1]-30), watermark_text, fill=(255,255,255,128), font=font)combined = Image.alpha_composite(img, watermark)combined.save(output_path, "PNG")for file in os.listdir("images"):if file.endswith(".jpg"):watermark_and_resize(f"images/{file}", f"output/{file}")
结果:每张图片都会自动生成一个带透明水印的缩略图。
十三、Pillow 的局限与替代方案
虽然 Pillow 功能强大,但也有一些局限性:
| 局限 | 替代或补充 |
|---|---|
| 无 GPU 加速 | OpenCV / PyTorch Vision |
| 处理大图性能不足 | NumPy + CuPy |
| 高级图像分割 / 检测 | 需结合深度学习框架 |
但在轻量任务、Web 服务、脚本工具中,Pillow 的性能与稳定性仍无可替代。
十四、总结与展望
Pillow 是 Python 图像处理的“瑞士军刀”,
它的优势在于:
- 简单易用,API 清晰
- 支持广泛的格式与操作
- 可与 NumPy、OpenCV、AI 框架无缝结合
- 适合脚本、Web、AI 各类场景
未来,随着图像 AI 的发展,Pillow 仍将作为图像预处理的基础层存在。
它不会被取代,而是被融合到更高层次的智能图像系统中。
✅ 结语
无论你是刚开始学习 Python 图像处理的学生,
还是正在开发 AI 图像识别系统的工程师,
掌握 Pillow 是你进入图像世界的第一步。
