Pillow (PIL) 库:高级图像处理与生成 (讲座模式)
各位观众老爷,大家好!今天咱们来聊聊 Python 图像处理的瑞士军刀——Pillow 库。 别听到“图像处理”就觉得高大上,难到爆炸。其实有了 Pillow,就像拥有了一个图像界的 PS 大师,各种骚操作都能轻松实现。
Pillow,原名 PIL (Python Imaging Library),后来因为种种原因分叉出来,改名为 Pillow。但它继承了 PIL 的强大基因,并在社区的持续维护下,变得更加稳定和易用。 所以,可以简单粗暴地理解为:Pillow 就是升级版的 PIL!
为什么要用 Pillow?
原因很简单,它能帮你:
- 读写各种图像格式: JPEG, PNG, GIF, TIFF, BMP… 只要你能想到的,它基本都支持。
- 图像的基本操作: 裁剪、缩放、旋转、颜色转换、滤镜… 简直是图像界的整容医生。
- 高级图像处理: 直方图均衡化、傅里叶变换、图像增强… 让你成为图像处理专家。
- 图像生成: 从零开始画图,添加文字、形状… 让你成为图像界的艺术家。
总而言之,你想对图像做什么,Pillow 都能帮你搞定。
准备工作:安装 Pillow
在开始之前,我们需要先安装 Pillow。 打开你的终端,输入以下命令:
pip install pillow
安装完成后,就可以开始我们的图像处理之旅了!
第一部分:图像的基本操作
首先,我们来学习一些图像的基本操作,就像学习武术的基本功一样。
1. 打开和显示图像
这是最基本的操作,就像打开冰箱门一样简单。
from PIL import Image
# 打开图像
img = Image.open("example.jpg") # 请替换成你自己的图片路径
# 显示图像
img.show()
这段代码会打开名为 example.jpg
的图像,并在你的电脑上显示出来。 如果你想在 Jupyter Notebook 中显示图像,可以使用以下代码:
from PIL import Image
import matplotlib.pyplot as plt
img = Image.open("example.jpg")
plt.imshow(img)
plt.axis('off') # 隐藏坐标轴
plt.show()
2. 图像的信息
了解图像的基本信息,就像了解一个人的身高体重一样重要。
from PIL import Image
img = Image.open("example.jpg")
print(f"图像格式: {img.format}")
print(f"图像大小: {img.size} (宽, 高)")
print(f"图像模式: {img.mode}")
img.format
: 图像的格式,例如 "JPEG", "PNG"。img.size
: 图像的尺寸,返回一个元组(width, height)
。img.mode
: 图像的模式,例如 "RGB", "RGBA", "L" (灰度图像)。
3. 裁剪图像
裁剪图像就像给照片瘦脸一样,可以突出重点。
from PIL import Image
img = Image.open("example.jpg")
# 定义裁剪区域 (左, 上, 右, 下)
box = (100, 100, 400, 400)
# 裁剪图像
cropped_img = img.crop(box)
# 保存裁剪后的图像
cropped_img.save("cropped_example.jpg")
# 显示裁剪后的图像
cropped_img.show()
crop()
函数接受一个元组 (left, upper, right, lower)
作为参数,定义了裁剪区域的左上角和右下角的坐标。
4. 缩放图像
缩放图像就像调整照片的大小一样,可以适应不同的场合。
from PIL import Image
img = Image.open("example.jpg")
# 定义新的尺寸
new_size = (200, 200)
# 缩放图像
resized_img = img.resize(new_size)
# 保存缩放后的图像
resized_img.save("resized_example.jpg")
# 显示缩放后的图像
resized_img.show()
resize()
函数接受一个元组 (width, height)
作为参数,定义了新的尺寸。
5. 旋转图像
旋转图像就像把照片倒过来一样,可以改变视角。
from PIL import Image
img = Image.open("example.jpg")
# 旋转图像 45 度
rotated_img = img.rotate(45) # 逆时针旋转
# 保存旋转后的图像
rotated_img.save("rotated_example.jpg")
# 显示旋转后的图像
rotated_img.show()
rotate()
函数接受一个角度作为参数,表示旋转的角度。 默认是逆时针旋转。
6. 图像模式转换
图像模式决定了图像的颜色信息如何存储。常见的模式有:
RGB
: 红绿蓝三通道,用于彩色图像。RGBA
: 红绿蓝 + 透明度,用于带透明通道的彩色图像。L
: 灰度图像。CMYK
: 青品黄黑,用于印刷。
from PIL import Image
img = Image.open("example.jpg")
# 转换为灰度图像
gray_img = img.convert("L")
# 保存灰度图像
gray_img.save("gray_example.jpg")
# 显示灰度图像
gray_img.show()
convert()
函数可以将图像转换为不同的模式。
第二部分:图像增强
图像增强就像给照片加滤镜一样,可以提升视觉效果。
1. 调整亮度、对比度、饱和度
ImageEnhance
模块提供了一系列类,可以调整图像的亮度、对比度、饱和度等。
from PIL import Image, ImageEnhance
img = Image.open("example.jpg")
# 调整亮度
enhancer = ImageEnhance.Brightness(img)
bright_img = enhancer.enhance(1.5) # 增强亮度 1.5 倍
# 调整对比度
enhancer = ImageEnhance.Contrast(img)
contrast_img = enhancer.enhance(1.2) # 增强对比度 1.2 倍
# 调整饱和度
enhancer = ImageEnhance.Color(img)
color_img = enhancer.enhance(0.8) # 降低饱和度 0.8 倍
# 调整锐度
enhancer = ImageEnhance.Sharpness(img)
sharp_img = enhancer.enhance(2.0) # 增强锐度 2.0 倍
# 保存增强后的图像
bright_img.save("bright_example.jpg")
contrast_img.save("contrast_example.jpg")
color_img.save("color_example.jpg")
sharp_img.save("sharp_example.jpg")
# 显示增强后的图像
bright_img.show()
contrast_img.show()
color_img.show()
sharp_img.show()
enhance()
函数接受一个浮点数作为参数,表示增强或降低的倍数。
2. 应用滤镜
ImageFilter
模块提供了一系列预定义的滤镜,可以给图像添加各种效果。
from PIL import Image, ImageFilter
img = Image.open("example.jpg")
# 应用模糊滤镜
blurred_img = img.filter(ImageFilter.BLUR)
# 应用边缘增强滤镜
edge_img = img.filter(ImageFilter.EDGE_ENHANCE)
# 应用浮雕滤镜
emboss_img = img.filter(ImageFilter.EMBOSS)
# 应用轮廓滤镜
contour_img = img.filter(ImageFilter.CONTOUR)
# 保存应用滤镜后的图像
blurred_img.save("blurred_example.jpg")
edge_img.save("edge_example.jpg")
emboss_img.save("emboss_example.jpg")
contour_img.save("contour_example.jpg")
# 显示应用滤镜后的图像
blurred_img.show()
edge_img.show()
emboss_img.show()
contour_img.show()
filter()
函数接受一个 ImageFilter
对象作为参数,表示要应用的滤镜。
常用的滤镜包括:
滤镜 | 描述 |
---|---|
BLUR |
模糊图像 |
EDGE_ENHANCE |
增强边缘 |
EMBOSS |
浮雕效果 |
CONTOUR |
轮廓提取 |
DETAIL |
增强细节 |
SMOOTH |
平滑图像 |
SHARPEN |
锐化图像 |
FIND_EDGES |
查找边缘 |
GaussianBlur(radius=2) |
高斯模糊,radius参数控制模糊程度 |
UnsharpMask(radius=2, percent=150, threshold=3) |
USM锐化,radius参数控制模糊半径,percent参数控制锐化程度,threshold参数控制锐化阈值 |
3. 直方图均衡化
直方图均衡化是一种常用的图像增强技术,可以改善图像的对比度。
from PIL import Image, ImageOps
img = Image.open("example.jpg").convert('L') # 转换为灰度图像
# 直方图均衡化
equalized_img = ImageOps.equalize(img)
# 保存均衡化后的图像
equalized_img.save("equalized_example.jpg")
# 显示均衡化后的图像
equalized_img.show()
ImageOps.equalize()
函数可以对图像进行直方图均衡化。
第三部分:图像生成
除了处理已有的图像,Pillow 还可以用来生成图像。
1. 创建新的图像
from PIL import Image
# 创建一个新的 RGB 图像
img = Image.new("RGB", (500, 500), color=(255, 255, 255)) # 白色背景
# 保存图像
img.save("new_image.png")
# 显示图像
img.show()
Image.new()
函数可以创建一个新的图像。 第一个参数是图像的模式,第二个参数是图像的尺寸,第三个参数是图像的颜色。
2. 绘制图形
ImageDraw
模块提供了一系列函数,可以在图像上绘制各种图形。
from PIL import Image, ImageDraw
# 创建一个新的 RGB 图像
img = Image.new("RGB", (500, 500), color=(255, 255, 255))
# 创建一个 Draw 对象
draw = ImageDraw.Draw(img)
# 绘制一个矩形
draw.rectangle((100, 100, 400, 400), fill=(255, 0, 0), outline=(0, 0, 0)) # 红色填充,黑色边框
# 绘制一个椭圆
draw.ellipse((150, 150, 350, 350), fill=(0, 255, 0), outline=(0, 0, 0)) # 绿色填充,黑色边框
# 绘制一条直线
draw.line((50, 50, 450, 450), fill=(0, 0, 255), width=5) # 蓝色,粗细为 5
# 保存图像
img.save("drawing_example.png")
# 显示图像
img.show()
常用的绘制函数包括:
函数 | 描述 |
---|---|
rectangle() |
绘制矩形 |
ellipse() |
绘制椭圆 |
line() |
绘制直线 |
polygon() |
绘制多边形 |
arc() |
绘制弧线 |
chord() |
绘制弦 |
pieslice() |
绘制扇形 |
point() |
绘制点 |
text() |
绘制文本 |
3. 添加文字
from PIL import Image, ImageDraw, ImageFont
# 创建一个新的 RGB 图像
img = Image.new("RGB", (500, 500), color=(255, 255, 255))
# 创建一个 Draw 对象
draw = ImageDraw.Draw(img)
# 加载字体
font = ImageFont.truetype("arial.ttf", size=36) # 请替换成你自己的字体文件路径, 如果没有arial.ttf,可以尝试其他字体,如simhei.ttf
# 添加文字
draw.text((100, 100), "Hello, Pillow!", fill=(0, 0, 0), font=font) # 黑色文字
# 保存图像
img.save("text_example.png")
# 显示图像
img.show()
ImageFont.truetype()
函数用于加载字体文件。 你需要提供字体文件的路径,以及字体的大小。 如果你没有特定的字体文件,可以使用系统自带的字体,或者从网上下载。 注意:如果字体文件不存在或者路径错误,程序会报错。 建议在同级目录下放置字体文件,或者使用绝对路径。
第四部分:高级应用
学会了基本操作,我们可以尝试一些高级应用。
1. 图像拼接
from PIL import Image
# 打开两张图像
img1 = Image.open("example1.jpg") # 请替换成你自己的图片路径
img2 = Image.open("example2.jpg") # 请替换成你自己的图片路径
# 调整图像大小,使其宽度相同
width = 500
img1 = img1.resize((width, int(img1.height * width / img1.width)))
img2 = img2.resize((width, int(img2.height * width / img2.width)))
# 创建一个新的图像,高度为两张图像的高度之和
new_img = Image.new("RGB", (width, img1.height + img2.height))
# 将两张图像粘贴到新的图像上
new_img.paste(img1, (0, 0))
new_img.paste(img2, (0, img1.height))
# 保存图像
new_img.save("拼接图像.jpg")
# 显示图像
new_img.show()
2. 图像水印
from PIL import Image, ImageDraw, ImageFont
# 打开图像
img = Image.open("example.jpg") # 请替换成你自己的图片路径
# 创建一个 Draw 对象
draw = ImageDraw.Draw(img)
# 加载字体
font = ImageFont.truetype("arial.ttf", size=36) # 请替换成你自己的字体文件路径
# 添加水印文字
text = "My Watermark"
textwidth, textheight = draw.textsize(text, font)
# 水印位置(右下角)
x = img.width - textwidth - 10
y = img.height - textheight - 10
draw.text((x, y), text, fill=(255, 255, 255), font=font) # 白色水印
# 保存图像
img.save("watermark_example.jpg")
# 显示图像
img.show()
3. GIF 动画处理
Pillow 也可以用来处理 GIF 动画。
from PIL import Image
# 打开 GIF 图像
img = Image.open("example.gif") # 请替换成你自己的GIF图片路径
# 获取 GIF 的帧数
nframes = img.n_frames
# 遍历每一帧
for i in range(nframes):
img.seek(i) # 选择第 i 帧
frame = img.convert("RGBA") # 转换为RGBA模式,方便修改
# 在每一帧上添加一些处理,例如水印
draw = ImageDraw.Draw(frame)
draw.text((10,10), f"Frame {i+1}", fill=(255,0,0)) #红色文字
# 保存每一帧
frame.save(f"frame_{i}.png") #保存为PNG图片
# 这里可以进行其他的图像处理操作
# 创建一个新的 GIF 动画
images = []
for i in range(nframes):
image = Image.open(f"frame_{i}.png")
images.append(image)
# 保存为 GIF 动画
images[0].save("new_animation.gif", save_all=True, append_images=images[1:], loop=0, duration=100) # duration是每帧的持续时间,单位是毫秒
总结
Pillow 库是一个非常强大的图像处理库,可以帮助你完成各种图像相关的任务。 今天我们只是简单地介绍了 Pillow 的一些基本用法,希望能够帮助你入门。 如果你想深入学习 Pillow,可以参考官方文档:https://pillow.readthedocs.io/en/stable/
最后,记住:图像处理是一门艺术,需要不断地实践和探索,才能掌握其中的奥秘。 祝大家在图像处理的道路上越走越远!