Python Imaging Library (Pillow) 图像处理教程
Pillow 项目地址: https://gitcode.com/gh_mirrors/pil/Pillow
核心概念:Image类
Python Imaging Library (Pillow) 中最核心的类是 Image
类,它提供了图像处理的基础功能。我们可以通过多种方式创建 Image 对象:
- 从文件加载图像
- 处理现有图像
- 从头创建新图像
加载图像示例
from PIL import Image
im = Image.open("example.jpg")
成功加载后,我们可以检查图像的基本属性:
print(im.format, im.size, im.mode)
# 输出示例: JPEG (800, 600) RGB
format
: 图像格式(如JPEG, PNG等),如果不是从文件加载则为Nonesize
: 图像尺寸(宽度,高度),单位为像素mode
: 图像模式,常见的有:- "L":灰度图像
- "RGB":真彩色图像
- "CMYK":印刷四色模式
图像读写操作
Pillow支持多种图像格式的读写,无需指定格式即可自动识别。
图像格式转换示例
将图像批量转换为JPEG格式:
import os
from PIL import Image
for infile in os.listdir('.'):
if infile.endswith('.png'):
outfile = os.path.splitext(infile)[0] + '.jpg'
try:
with Image.open(infile) as im:
im.save(outfile)
except OSError:
print(f"无法转换 {infile}")
创建缩略图
from PIL import Image
size = (128, 128) # 缩略图尺寸
for infile in os.listdir('.'):
if infile.endswith('.jpg'):
outfile = os.path.splitext(infile)[0] + '_thumb.jpg'
try:
with Image.open(infile) as im:
im.thumbnail(size)
im.save(outfile)
except OSError:
print(f"无法为 {infile} 创建缩略图")
图像编辑与合成
裁剪与粘贴
# 定义裁剪区域(左,上,右,下)
box = (100, 100, 400, 400)
region = im.crop(box)
# 旋转180度后粘贴回原位置
region = region.rotate(180)
im.paste(region, box)
图像拼接
def merge_images(im1, im2):
"""水平拼接两张图片"""
width = im1.width + im2.width
height = max(im1.height, im2.height)
new_im = Image.new('RGB', (width, height))
new_im.paste(im1, (0, 0))
new_im.paste(im2, (im1.width, 0))
return new_im
通道操作
# 分离RGB通道
r, g, b = im.split()
# 交换红色和蓝色通道
new_im = Image.merge('RGB', (b, g, r))
几何变换
基本变换
# 调整大小
resized = im.resize((300, 300))
# 旋转45度
rotated = im.rotate(45)
# 镜像翻转
flipped = im.transpose(Image.FLIP_LEFT_RIGHT)
相对尺寸调整
Pillow提供了多种相对调整尺寸的方法:
from PIL import ImageOps
# 保持比例,适应给定尺寸
ImageOps.contain(im, (100, 150))
# 保持比例,覆盖给定尺寸
ImageOps.cover(im, (100, 150))
# 精确匹配给定尺寸,可能变形
ImageOps.fit(im, (100, 150))
# 保持比例,填充到给定尺寸
ImageOps.pad(im, (100, 150), color='white')
颜色处理
模式转换
# 转换为灰度图
gray_im = im.convert('L')
# 转换为RGBA(带透明度)
rgba_im = im.convert('RGBA')
图像增强
from PIL import ImageEnhance
# 对比度增强
enhancer = ImageEnhance.Contrast(im)
enhanced_im = enhancer.enhance(1.5) # 增强50%
# 亮度调整
bright_enhancer = ImageEnhance.Brightness(im)
bright_im = bright_enhancer.enhance(0.8) # 降低20%亮度
高级技巧
处理动画/GIF
from PIL import ImageSequence
# 逐帧处理GIF动画
for frame in ImageSequence.Iterator(im):
# 对每一帧进行处理
processed_frame = frame.rotate(10)
# ...保存或显示处理后的帧...
点操作(像素级处理)
# 提高图像亮度
brightened = im.point(lambda x: x * 1.2)
# 二值化处理(阈值128)
binary = im.point(lambda x: 255 if x > 128 else 0)
选择性处理
# 只处理红色通道值小于100的区域
source = im.split()
mask = source[0].point(lambda x: 255 if x < 100 else 0)
processed = source[1].point(lambda x: x * 0.7) # 降低绿色通道亮度
source[1].paste(processed, None, mask) # 只应用在mask区域
最佳实践
- 使用上下文管理器:处理文件时使用
with
语句确保资源正确释放 - 批量处理:对于大量图像,考虑使用多线程或批处理
- 渐进式处理:大图像可分块处理以减少内存占用
- 格式选择:根据需求选择合适格式(JPEG适合照片,PNG适合图形)
- 元数据保留:某些操作会丢失元数据,必要时需单独保存
通过掌握这些基础操作,你已经能够使用Pillow完成大多数常见的图像处理任务。对于更高级的需求,Pillow还提供了滤镜、绘图等更多功能。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考