Python Imaging Library (Pillow) 图像处理教程

Python Imaging Library (Pillow) 图像处理教程

Pillow Pillow 项目地址: https://gitcode.com/gh_mirrors/pil/Pillow

核心概念:Image类

Python Imaging Library (Pillow) 中最核心的类是 Image 类,它提供了图像处理的基础功能。我们可以通过多种方式创建 Image 对象:

  1. 从文件加载图像
  2. 处理现有图像
  3. 从头创建新图像

加载图像示例

from PIL import Image
im = Image.open("example.jpg")

成功加载后,我们可以检查图像的基本属性:

print(im.format, im.size, im.mode)
# 输出示例: JPEG (800, 600) RGB
  • format: 图像格式(如JPEG, PNG等),如果不是从文件加载则为None
  • size: 图像尺寸(宽度,高度),单位为像素
  • 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区域

最佳实践

  1. 使用上下文管理器:处理文件时使用with语句确保资源正确释放
  2. 批量处理:对于大量图像,考虑使用多线程或批处理
  3. 渐进式处理:大图像可分块处理以减少内存占用
  4. 格式选择:根据需求选择合适格式(JPEG适合照片,PNG适合图形)
  5. 元数据保留:某些操作会丢失元数据,必要时需单独保存

通过掌握这些基础操作,你已经能够使用Pillow完成大多数常见的图像处理任务。对于更高级的需求,Pillow还提供了滤镜、绘图等更多功能。

Pillow Pillow 项目地址: https://gitcode.com/gh_mirrors/pil/Pillow

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芮妍娉Keaton

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值