当前位置:首页 > Python > 正文

Python PIL库教程:图像处理入门到实战 - 深度求索

Python PIL库图像处理完全指南

作者:深度求索 2023年10月15日

1. PIL库简介

Python Imaging Library (PIL) 是Python中最受欢迎的图像处理库之一。尽管原始PIL项目已停止维护,但其分支库Pillow提供了更好的兼容性和更多功能,已成为Python图像处理的事实标准。

PIL/Pillow的主要功能:

  • 图像打开、保存和格式转换
  • 基本图像操作:裁剪、旋转、缩放
  • 颜色空间转换
  • 图像增强:滤镜、对比度调整
  • 文字和图形绘制
  • 图像分析:直方图、像素操作

2. 安装与环境配置

安装Pillow非常简单,使用pip命令即可:

pip install pillow

安装完成后,可以使用以下代码验证安装:

from PIL import Image

# 打印Pillow版本
print(Image.__version__)

注意事项:

  • Pillow支持多种图像格式:JPEG, PNG, BMP, TIFF等
  • 在Linux系统上可能需要额外安装图像库:sudo apt-get install libjpeg-dev zlib1g-dev
  • 建议在虚拟环境中安装

3. 基础图像操作

3.1 打开和显示图像

from PIL import Image

# 打开图像
img = Image.open('example.jpg')

# 显示图像
img.show()

3.2 获取图像信息

# 获取图像格式
print(img.format)  # 输出: JPEG

# 获取图像尺寸
print(img.size)    # 输出: (宽度, 高度)

# 获取图像模式
print(img.mode)    # 输出: RGB (或其他模式如L, CMYK)

3.3 保存图像

# 保存为不同格式
img.save('output.png')   # 保存为PNG格式
img.save('output.webp')  # 保存为WebP格式

# 指定质量参数(JPEG)
img.save('high_quality.jpg', quality=95)

4. 图像处理技术

4.1 调整图像大小

# 调整尺寸
resized_img = img.resize((400, 300))

# 保持宽高比调整大小
img.thumbnail((800, 800))  # 最大尺寸为800px

4.2 裁剪图像

# 定义裁剪区域 (left, upper, right, lower)
box = (100, 100, 500, 400)
cropped_img = img.crop(box)

4.3 旋转图像

# 旋转45度
rotated_img = img.rotate(45)

# 旋转并填充背景色
rotated_img = img.rotate(30, expand=True, fillcolor=(255, 0, 0))

4.4 应用滤镜

from PIL import ImageFilter

# 模糊滤镜
blurred = img.filter(ImageFilter.BLUR)

# 边缘增强
edge_enhanced = img.filter(ImageFilter.EDGE_ENHANCE)

# 轮廓滤镜
contour = img.filter(ImageFilter.CONTOUR)

# 自定义卷积核
kernel = ImageFilter.Kernel((3, 3), [0, -1, 0, -1, 5, -1, 0, -1, 0])
custom_filter = img.filter(kernel)

5. 高级图像操作

5.1 图像合成

# 打开两张图片
img1 = Image.open('background.jpg')
img2 = Image.open('foreground.png')

# 将img2粘贴到img1上 (位置, 蒙版)
img1.paste(img2, (100, 50), img2)

5.2 绘制图形和文字

from PIL import ImageDraw, ImageFont

# 创建绘图对象
draw = ImageDraw.Draw(img)

# 绘制矩形
draw.rectangle([(100, 100), (300, 300)], outline="red", width=3)

# 绘制文本
font = ImageFont.truetype("arial.ttf", 40)
draw.text((150, 350), "Hello PIL!", fill="blue", font=font)

5.3 颜色空间转换

# 转换为灰度图
gray_img = img.convert('L')

# 转换为CMYK
cmyk_img = img.convert('CMYK')

# 分离RGB通道
r, g, b = img.split()

6. 实际应用案例

6.1 创建缩略图

def create_thumbnail(input_path, output_path, size=(200, 200)):
    try:
        img = Image.open(input_path)
        img.thumbnail(size)
        img.save(output_path)
        return True
    except Exception as e:
        print(f"Error: {e}")
        return False

create_thumbnail('large_image.jpg', 'thumbnail.jpg')

6.2 批量处理图像

import os

def batch_resize(input_folder, output_folder, size=(1024, 768)):
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
    
    for filename in os.listdir(input_folder):
        if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
            input_path = os.path.join(input_folder, filename)
            output_path = os.path.join(output_folder, filename)
            
            try:
                img = Image.open(input_path)
                img.thumbnail(size)
                img.save(output_path)
                print(f"Processed: {filename}")
            except Exception as e:
                print(f"Failed to process {filename}: {e}")

batch_resize('input_images', 'resized_images')

6.3 添加水印

def add_watermark(image_path, output_path, watermark_text, font_size=36):
    img = Image.open(image_path).convert("RGBA")
    
    # 创建水印层
    txt = Image.new("RGBA", img.size, (255, 255, 255, 0))
    draw = ImageDraw.Draw(txt)
    
    # 使用字体
    try:
        font = ImageFont.truetype("arial.ttf", font_size)
    except:
        font = ImageFont.load_default()
    
    # 计算水印位置
    text_width, text_height = draw.textsize(watermark_text, font)
    x = img.width - text_width - 20
    y = img.height - text_height - 20
    
    # 绘制半透明水印
    draw.text((x, y), watermark_text, font=font, fill=(255, 255, 255, 128))
    
    # 合并图像和水印
    watermarked = Image.alpha_composite(img, txt)
    watermarked.convert("RGB").save(output_path)

add_watermark('photo.jpg', 'watermarked.jpg', "© DeepSeek")

总结

Python的PIL库(Pillow)是一个功能强大且易于使用的图像处理库。通过本教程,您已经学习了:

  • PIL库的安装和基本使用方法
  • 图像打开、保存和格式转换
  • 基础图像处理操作:调整大小、裁剪、旋转
  • 滤镜应用和图像增强技术
  • 高级操作:图像合成、绘制、颜色空间转换
  • 实际应用案例:缩略图生成、批量处理和水印添加

Pillow库在Web开发、数据科学、计算机视觉等领域都有广泛应用。建议进一步探索其官方文档以了解更多高级功能。

进一步学习资源:

发表评论