利用Python PIL进行图像操作 – wiki词典


利用 Python PIL (Pillow) 进行图像操作

图像处理是计算机视觉、网页开发、数据分析等领域中不可或缺的一部分。Python 的 PIL (Python Imaging Library) 及其分支 Pillow 是处理图像的强大工具,它提供了广泛的图像文件格式支持,并能进行各种图像操作。

1. 什么是 PIL/Pillow?

PIL 是 Python 事实上的图像处理标准库。然而,PIL 的开发在 2009 年停止。为了继续其发展和兼容现代 Python 版本,一个名为 Pillow 的分支项目应运而生。Pillow 完全兼容 PIL 的 API,并且修复了许多错误,增加了新功能,并支持 Python 3.x。因此,当你看到提及 PIL 时,通常指的就是 Pillow

为什么选择 Pillow?

  • 易用性: 提供了直观的 API,即使是图像处理新手也能快速上手。
  • 功能强大: 支持多种图像格式(JPEG, PNG, GIF, BMP, TIFF 等),并提供丰富的图像操作功能。
  • 广泛应用: 在 Web 应用、科学计算、自动化脚本等多个领域都有广泛应用。
  • 活跃维护: Pillow 项目社区活跃,持续更新和改进。

2. 安装 Pillow

在使用之前,你需要先安装 Pillow。打开你的终端或命令行工具,运行以下命令:

bash
pip install Pillow

3. 基本图像操作

所有图像操作都从 Image 模块开始。通常我们将其导入为 Image

python
from PIL import Image

3.1 打开和保存图像

打开图像:

python
try:
# 打开一个图像文件
img = Image.open("images/test.jpg") # 确保你有这个文件,或者替换为你的图片路径
print("图像成功打开!")
except FileNotFoundError:
print("错误:文件未找到。请检查图片路径。")
except Exception as e:
print(f"打开图像时发生错误: {e}")

保存图像:

你可以将处理后的图像保存为不同的格式。Pillow 会根据文件扩展名自动识别格式。

“`python

假设 img 已经是一个打开的 Image 对象

保存为 PNG 格式

img.save(“output_image.png”)
print(“图像已保存为 output_image.png”)

保存为 JPEG 格式,可以指定质量(0-100,默认75)

img.save(“output_image_low_quality.jpg”, quality=50)
print(“图像已保存为 output_image_low_quality.jpg (质量50)”)
“`

3.2 显示图像

在开发环境中,你可能希望快速查看处理结果。show() 方法可以帮助你做到这一点。

“`python

img.show() # 这会在你的系统默认图像查看器中打开图片

“`

3.3 获取图像信息

获取图像的基本属性,如大小、格式和模式。

“`python

假设 img 已经是一个打开的 Image 对象

print(f”图像格式: {img.format}”) # 例如: JPEG, PNG
print(f”图像模式: {img.mode}”) # 例如: RGB, L (灰度), RGBA (带透明度)
print(f”图像尺寸: {img.size}”) # 返回 (宽度, 高度) 元组
print(f”图像宽度: {img.width}”)
print(f”图像高度: {img.height}”)
“`

4. 图像操作与转换

Pillow 提供了丰富的函数来修改图像。

4.1 调整图像大小 (Resize)

resize() 方法可以改变图像的尺寸。它需要一个新的尺寸元组 (width, height)

“`python

假设 img 已经是一个打开的 Image 对象

new_size = (300, 200)
resized_img = img.resize(new_size)
resized_img.save(“resized_image.jpg”)
print(f”图像已调整大小为 {new_size} 并保存。”)

保持比例缩放

计算新的高度以保持宽高比

original_width, original_height = img.size
aspect_ratio = original_height / original_width
new_width = 600
new_height = int(new_width * aspect_ratio)
resized_img_proportional = img.resize((new_width, new_height))
resized_img_proportional.save(“resized_proportional.jpg”)
print(f”图像已按比例调整大小为 {new_width}x{new_height} 并保存。”)
“`

4.2 裁剪图像 (Crop)

crop() 方法从图像中提取一个矩形区域。它需要一个四元组 (left, upper, right, lower),表示裁剪框的坐标。

“`python

假设 img 已经是一个打开的 Image 对象

裁剪区域 (left, upper, right, lower)

从左上角 (50, 50) 到右下角 (250, 250)

crop_box = (50, 50, 250, 250)
cropped_img = img.crop(crop_box)
cropped_img.save(“cropped_image.jpg”)
print(f”图像已裁剪并保存。”)
“`

4.3 旋转图像 (Rotate)

rotate() 方法可以旋转图像。角度以逆时针方向计算。

“`python

假设 img 已经是一个打开的 Image 对象

旋转 90 度

rotated_img = img.rotate(90, expand=True) # expand=True 会扩展画布以容纳整个旋转后的图像
rotated_img.save(“rotated_90_image.jpg”)
print(“图像已旋转90度并保存。”)

旋转 45 度,不扩展画布

rotated_img_45 = img.rotate(45)
rotated_img_45.save(“rotated_45_image.jpg”)
print(“图像已旋转45度(不扩展画布)并保存。”)
“`

4.4 翻转图像 (Flip)

Image.FLIP_LEFT_RIGHTImage.FLIP_TOP_BOTTOM 用于水平和垂直翻转。

“`python
from PIL import Image

假设 img 已经是一个打开的 Image 对象

flipped_lr_img = img.transpose(Image.FLIP_LEFT_RIGHT)
flipped_lr_img.save(“flipped_lr_image.jpg”)
print(“图像已水平翻转并保存。”)

flipped_tb_img = img.transpose(Image.FLIP_TOP_BOTTOM)
flipped_tb_img.save(“flipped_tb_image.jpg”)
print(“图像已垂直翻转并保存。”)
“`

4.5 颜色转换

将图像转换为不同的模式,例如灰度图 ('L')。

“`python

假设 img 已经是一个打开的 Image 对象

grayscale_img = img.convert(‘L’)
grayscale_img.save(“grayscale_image.jpg”)
print(“图像已转换为灰度图并保存。”)

转换为 RGBA 模式 (处理透明度)

rgba_img = img.convert(‘RGBA’)
rgba_img.save(“rgba_image.png”) # 通常透明度保存为 PNG
print(“图像已转换为 RGBA 模式并保存。”)
“`

4.6 应用滤镜

PIL.ImageFilter 模块提供了多种预定义的图像滤镜。

“`python
from PIL import Image, ImageFilter

假设 img 已经是一个打开的 Image 对象

应用高斯模糊滤镜

blurred_img = img.filter(ImageFilter.GaussianBlur(radius=5))
blurred_img.save(“blurred_image.jpg”)
print(“图像已应用高斯模糊并保存。”)

应用锐化滤镜

sharpened_img = img.filter(ImageFilter.SHARPEN)
sharpened_img.save(“sharpened_image.jpg”)
print(“图像已应用锐化滤镜并保存。”)
“`

4.7 绘制图形和文字

PIL.ImageDraw 模块允许你在图像上绘制形状和文字。

“`python
from PIL import Image, ImageDraw, ImageFont

创建一个空白图像作为画布

canvas = Image.new(‘RGB’, (400, 300), color = ‘white’)
draw = ImageDraw.Draw(canvas)

绘制一个矩形

draw.rectangle((50, 50, 150, 150), fill=’red’, outline=’blue’, width=2)

绘制一个椭圆 (用于圆形)

draw.ellipse((200, 50, 300, 150), fill=’green’, outline=’purple’, width=3)

绘制一条线

draw.line((50, 200, 350, 250), fill=’black’, width=5)

添加文字

try:
# 尝试加载一个字体文件,如果系统没有,可能需要指定完整路径
font = ImageFont.truetype(“arial.ttf”, 30) # 替换为你系统中的字体文件
except IOError:
font = ImageFont.load_default() # 如果找不到指定字体,加载默认字体
draw.text((50, 260), “Hello, Pillow!”, fill=(255, 128, 0), font=font)

canvas.save(“drawn_shapes_text.png”)
print(“绘制了形状和文字的图像已保存。”)
“`

4.8 图像合成与粘贴 (Paste)

paste() 方法允许你将一张图像粘贴到另一张图像上。

“`python

假设 img 已经是一个打开的 Image 对象 (作为背景)

创建一个小的红色方块图像作为前景

overlay_img = Image.new(‘RGBA’, (100, 100), color = (255, 0, 0, 128)) # 半透明红色

将前景图像粘贴到背景图像上,位置为 (100, 100)

mask 参数允许处理透明度

img_copy = img.copy() # 复制一份,避免修改原图
img_copy.paste(overlay_img, (100, 100), overlay_img)
img_copy.save(“pasted_image.png”)
print(“图像已粘贴并保存。”)
“`

5. 高级图像操作 (简述)

5.1 图像增强 (ImageEnhance)

PIL.ImageEnhance 模块提供了调整图像的亮度、对比度、颜色和锐度的方法。

“`python
from PIL import Image, ImageEnhance

假设 img 已经是一个打开的 Image 对象

enhancer = ImageEnhance.Brightness(img)
bright_img = enhancer.enhance(1.5) # 提高亮度 50%
bright_img.save(“brightened_image.jpg”)
print(“图像亮度已增强并保存。”)

enhancer = ImageEnhance.Contrast(img)
contrast_img = enhancer.enhance(2.0) # 提高对比度 100%
contrast_img.save(“contrast_image.jpg”)
print(“图像对比度已增强并保存。”)
“`

5.2 处理透明度 (Alpha Channel)

对于支持透明度的图像(如 PNG),Pillow 可以很好地处理 RGBA 模式。当你需要合并带有透明度的图像时,paste() 方法的 mask 参数非常重要。

6. 总结与进阶

Pillow 是一个功能强大且易于使用的 Python 图像处理库。本文涵盖了其基本操作,从打开、保存、显示图像,到执行调整大小、裁剪、旋转、滤镜等常见任务,以及在图像上绘制图形和文字。

进阶学习方向:

  • 图像数组操作: 将图像转换为 NumPy 数组,利用 NumPy 的强大功能进行像素级别的处理,然后再转换回 Pillow 图像。
  • 图像直方图: 分析图像的颜色分布。
  • 图像水印: 为图片添加水印。
  • Web 框架集成: 将 Pillow 集成到 Flask、Django 等 Web 框架中,实现图片上传和处理功能。

通过熟练掌握 Pillow,你将能够高效地完成各种图像处理任务,无论是简单的批量缩放,还是复杂的图像合成,它都能助你一臂之力。


滚动至顶部