1. Python图像处理入门:PIL/Pillow基础
在数字图像处理领域,Python凭借其丰富的库生态系统占据重要地位。Pillow作为PIL(Python Imaging Library)的现代分支,已经成为Python图像处理的事实标准库。我最初接触这个库是在2013年处理一批商品图片时,当时需要批量调整数千张图片尺寸并添加水印,Pillow的高效表现让我印象深刻。
Pillow库支持超过30种图像文件格式的读写操作,包括常见的JPEG、PNG、BMP、GIF等,也支持PSD、WebP等较新的格式。其核心功能包括:
- 基本图像操作(打开、保存、显示)
- 图像变换(缩放、旋转、裁剪)
- 颜色空间转换
- 图像增强(锐化、模糊、对比度调整)
- 文字和图形绘制
- 图像滤镜应用
注意:Pillow与原始PIL不兼容,如果项目中已经安装了PIL,需要先卸载才能安装Pillow。在导入时仍然使用
from PIL import的语法,这是为了保持向后兼容性。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与安装配置
2.1 安装Pillow库
安装Pillow非常简单,使用pip即可完成。但根据不同的使用场景,可能需要额外安装一些依赖:
bash复制# 基础安装
pip install pillow
# 如果需要处理JPEG2000格式
pip install pillow[jpeg2000]
# 完整安装所有可选功能
pip install pillow[all]
在Linux系统上,可能需要先安装一些系统依赖:
bash复制# Ubuntu/Debian
sudo apt-get install libjpeg-dev libpng-dev libtiff-dev zlib1g-dev
# CentOS/RHEL
sudo yum install libjpeg-devel libpng-devel libtiff-devel zlib-devel
2.2 验证安装
安装完成后,可以通过以下方式验证Pillow是否正常工作:
python复制from PIL import Image, ImageFilter
# 创建一个新图像
img = Image.new('RGB', (100, 100), color='red')
img.save('test.png')
# 检查支持的格式
print(Image.SAVE.keys()) # 可保存的格式
print(Image.OPEN.keys()) # 可打开的格式
3. 核心功能详解
3.1 图像基本操作
打开和显示图像
python复制from PIL import Image
# 打开图像
img = Image.open('example.jpg')
# 显示图像 (依赖系统默认图片查看器)
img.show()
# 获取图像信息
print(f"格式: {img.format}") # JPEG, PNG等
print(f"尺寸: {img.size}") # (宽度, 高度)
print(f"模式: {img.mode}") # RGB, L(灰度), CMYK等
实际经验:在服务器环境中,
show()方法通常不可用,因为缺少图形界面。这时可以保存图像后用其他方式查看。
保存图像
保存图像时可以通过参数控制质量和其他选项:
python复制# 基本保存
img.save('output.jpg')
# 高质量JPEG保存 (质量范围1-100,默认75)
img.save('high_quality.jpg', quality=95)
# 渐进式JPEG
img.save('progressive.jpg', progressive=True)
# PNG压缩级别 (1-9,9是最高压缩)
img.save('compressed.png', compress_level=9)
# 保存为不同格式
img.save('output.webp', lossless=True)
3.2 图像变换操作
调整尺寸
python复制# 缩放到指定尺寸
smaller = img.resize((300, 200))
# 保持宽高比的缩放
from PIL import ImageOps
# 计算新尺寸,保持宽高比
width, height = img.size
new_height = 300
new_width = int(width * (new_height / height))
resized = img.resize((new_width, new_height))
# 使用thumbnail方法 (原地修改)
img.thumbnail((300, 300)) # 最大不超过300x300
旋转和翻转
python复制# 简单旋转 (90度倍数)
rotated = img.rotate(90)
# 任意角度旋转 (填充背景色)
rotated = img.rotate(45, expand=True, fillcolor='white')
# 镜像翻转
flipped = img.transpose(Image.FLIP_LEFT_RIGHT)
flipped = img.transpose(Image.FLIP_TOP_BOTTOM)
裁剪和拼接
python复制# 矩形区域裁剪 (左,上,右,下)
box = (100, 100, 400, 400)
cropped = img.crop(box)
# 图像拼接
from PIL import Image
images = [Image.open(f'image_{i}.jpg') for i in range(3)]
widths, heights = zip(*(i.size for i in images))
total_width = sum(widths)
max_height = max(heights)
new_img = Image.new('RGB', (total_width, max_height))
x_offset = 0
for im in images:
new_img.paste(im, (x_offset,0))
x_offset += im.size[0]
new_img.save('combined.jpg')
3.3 颜色处理
颜色空间转换
python复制# 转换为灰度
gray = img.convert('L')
# 转换为CMYK
cmyk = img.convert('CMYK')
# 分离通道
r, g, b = img.split()
# 合并通道
merged = Image.merge('RGB', (r, g, b))
颜色增强
python复制from PIL import ImageEnhance
# 亮度增强
enhancer = ImageEnhance.Brightness(img)
bright = enhancer.enhance(1.5) # 1.5倍亮度
# 对比度增强
enhancer = ImageEnhance.Contrast(img)
contrast = enhancer.enhance(2.0)
# 锐化
enhancer = ImageEnhance.Sharpness(img)
sharp = enhancer.enhance(3.0)
3.4 滤镜效果
Pillow提供了多种内置滤镜:
python复制from PIL import ImageFilter
# 模糊效果
blurred = img.filter(ImageFilter.BLUR)
gaussian_blur = img.filter(ImageFilter.GaussianBlur(radius=2))
# 边缘检测
edges = img.filter(ImageFilter.FIND_EDGES)
# 轮廓
contour = img.filter(ImageFilter.CONTOUR)
# 细节增强
detail = img.filter(ImageFilter.DETAIL)
# 浮雕效果
emboss = img.filter(ImageFilter.EMBOSS)
# 自定义卷积核
kernel = ImageFilter.Kernel((3,3),
[0, -1, 0, -1, 5, -1, 0, -1, 0],
scale=1, offset=0)
custom = img.filter(kernel)
4. 高级应用技巧
4.1 文字绘制
python复制from PIL import ImageDraw, ImageFont
# 创建绘图对象
draw = ImageDraw.Draw(img)
# 使用系统字体
font = ImageFont.load_default()
# 或者指定字体文件
try:
font = ImageFont.truetype("arial.ttf", 40)
except IOError:
font = ImageFont.load_default()
# 绘制文字
draw.text((10, 10), "Hello World", fill="white", font=font)
# 获取文字尺寸
text_width, text_height = draw.textsize("Hello World", font=font)
# 绘制带背景的文字
draw.rectangle([(10,10), (10+text_width, 10+text_height)], fill="black")
draw.text((10, 10), "Hello World", fill="white", font=font)
4.2 图形绘制
python复制draw = ImageDraw.Draw(img)
# 绘制直线
draw.line([(0, 0), (100, 100)], fill="red", width=5)
# 绘制矩形
draw.rectangle([(50, 50), (150, 150)], fill="blue", outline="yellow")
# 绘制椭圆
draw.ellipse([(50, 50), (150, 150)], fill="green", outline="black")
# 绘制多边形
draw.poly
