【python】Pillow 快速入门
Pillow 快速入门
文章目录
- Pillow 快速入门
- 一、基础准备:安装与环境配置
- 1. 安装 Pillow
- 2. 核心概念铺垫
- 二、入门阶段:基础图像操作
- 1. 打开与保存图片
- 2. 转换图像模式
- 3. 简单格式转换与批量处理
- 三、核心功能:图像编辑与处理
- 1. 裁剪(Crop)
- 2. 缩放(Resize)
- 3. 旋转与翻转
- 4. 粘贴与合成(Paste)
- 四、进阶操作:图像增强与分析
- 1. 图像增强(ImageEnhance)
- 2. 像素级操作(手动修改像素)
- 3. 边缘检测(简单实现)
- 五、高级应用:与其他工具结合与性能优化
- 1. 处理透明通道(RGBA 模式)
- 2. 批量处理与性能优化
- 3. 与 OpenCV 协作
- 总结:学习路径
一、基础准备:安装与环境配置
1. 安装 Pillow
Pillow 是 PIL(Python Imaging Library)的替代库(PIL 已停止维护),支持 Python 3.6+。
安装命令:
pip install pillow
验证安装(终端运行):
from PIL import Image
print(Image.__version__) # 输出版本号即成功
2. 核心概念铺垫
- •图像模式(Mode):Pillow 中图像的模式决定了像素数据的存储方式,常见模式:•
L
(灰度)、RGB
(红绿蓝彩色)、RGBA
(带透明通道的彩色)、CMYK
(印刷四色)、1
(二值图)等。 - •图像对象(Image):Pillow 操作的核心对象,通过
Image.open()
加载图片后生成。
二、入门阶段:基础图像操作
目标:能完成图片的打开、保存、查看元信息、简单格式转换。
1. 打开与保存图片
from PIL import Image# 打开图片(支持 JPG/PNG/GIF/BMP 等常见格式)
img = Image.open("input.jpg") # 路径可以是绝对或相对路径# 查看图片信息
print(f"格式: {img.format}") # 原格式(如 JPEG)
print(f"模式: {img.mode}") # 模式(如 RGB)
print(f"尺寸: {img.size}") # (宽度, 高度)
print(f"文件名: {img.filename}")# 原文件名# 保存图片(可指定格式,默认同原格式)
img.save("output.png") # 保存为 PNG
img.save("output.webp", "WEBP")# 显式指定格式
2. 转换图像模式
不同模式间可互相转换(如 RGB 转灰度):
# RGB 转灰度(L 模式)
gray_img = img.convert("L")
gray_img.save("gray.jpg")# RGBA 转 RGB(去除透明通道)
rgba_img = Image.open("transparent.png")
rgb_img = rgba_img.convert("RGB")
rgb_img.save("no_alpha.jpg")
3. 简单格式转换与批量处理
批量将 JPG 转 PNG:
import osinput_dir = "jpg_images"
output_dir = "png_images"os.makedirs(output_dir, exist_ok=True)for filename in os.listdir(input_dir):if filename.endswith(".jpg"):img = Image.open(os.path.join(input_dir, filename))img.save(os.path.join(output_dir, f"{os.path.splitext(filename)[0]}.png"))
三、核心功能:图像编辑与处理
目标:掌握裁剪、缩放、旋转、翻转等常用操作,理解不同方法的差异。
1. 裁剪(Crop)
通过 crop()
方法截取指定区域(参数为左上角和右下角坐标元组 (x0, y0, x1, y1)
):
# 原图尺寸 (width=800, height=600)
box = (100, 100, 500, 400) # 截取中间区域
cropped_img = img.crop(box)
cropped_img.save("cropped.jpg")
2. 缩放(Resize)
使用 resize()
调整尺寸,支持多种重采样滤波器(影响清晰度):
# 直接指定目标尺寸(宽度, 高度)
resized_img = img.resize((400, 300)) # 默认双线性滤波(BILINEAR)# 指定滤波器(更清晰或更快)
from PIL import Imagemethods = {"nearest": Image.NEAREST, # 最近邻(最快,模糊)"bilinear": Image.BILINEAR, # 双线性(平衡)"bicubic": Image.BICUBIC, # 双三次(更清晰,慢)"lanczos": Image.LANCZOS # Lanczos(最高质量,最慢)
}# 使用 Lanczos 滤镜高质量缩放
high_quality_resized = img.resize((400, 300), resample=methods["lanczos"])
high_quality_resized.save("resized_lanczos.jpg")# 快捷方法:thumbnail() 生成缩略图(保持比例,不超过指定尺寸)
img.thumbnail((200, 200)) # 原图会被缩小到最大边 200px,保持比例
img.save("thumbnail.jpg") # 注意:thumbnail 是原地修改!
3. 旋转与翻转
- •旋转:
rotate(angle, expand=True)
(角度,是否扩展画布避免裁切) - •翻转:
transpose()
或transpose_method
(如左右/上下翻转)
# 旋转 45 度,扩展画布
rotated_img = img.rotate(45, expand=True)
rotated_img.save("rotated.jpg")# 左右翻转(镜像)
flipped_h = img.transpose(Image.FLIP_LEFT_RIGHT)
flipped_h.save("flipped_h.jpg")# 上下翻转
flipped_v = img.transpose(Image.FLIP_TOP_BOTTOM)
flipped_v.save("flipped_v.jpg")
4. 粘贴与合成(Paste)
将一张图粘贴到另一张图上,支持掩码(Mask)控制透明度:
# 加载背景图和水印图(水印需 RGBA 模式)
background = Image.open("background.jpg").convert("RGBA")
watermark = Image.open("watermark.png").convert("RGBA")# 调整水印大小
watermark = watermark.resize((background.size[0]//2, background.size[1]//2))# 粘贴水印到背景中心(使用水印自身作为掩码,保留透明度)
position = ((background.size[0] - watermark.size[0]) // 2,(background.size[1] - watermark.size[1]) // 2
)
background.paste(watermark, position, watermark) # 第三个参数是掩码(RGBA 图)
background.save("watermarked_bg.png")
四、进阶操作:图像增强与分析
目标:掌握亮度/对比度调整、色彩校正、边缘检测等高级处理。
1. 图像增强(ImageEnhance)
使用 ImageEnhance
模块调整亮度、对比度、饱和度等:
from PIL import ImageEnhance# 亮度调整(factor=1.0 原图,>1 更亮,<1 更暗)
enhancer = ImageEnhance.Brightness(img)
bright_img = enhancer.enhance(1.5) # 提高 50% 亮度
bright_img.save("bright.jpg")# 对比度调整
enhancer = ImageEnhance.Contrast(img)
contrast_img = enhancer.enhance(2.0) # 对比度翻倍
contrast_img.save("contrast.jpg")# 饱和度调整(仅 RGB/RGBA 图有效)
enhancer = ImageEnhance.Color(img)
saturated_img = enhancer.enhance(1.8) # 更鲜艳
saturated_img.save("saturated.jpg")
2. 像素级操作(手动修改像素)
直接访问像素值,实现自定义效果(如反色、灰度变换):
# 反色处理(RGB 取反)
pixels = img.load() # 获取像素矩阵(可修改)
width, height = img.sizefor x in range(width):for y in range(height):r, g, b = pixels[x, y] # 假设是 RGB 模式pixels[x, y] = (255 - r, 255 - g, 255 - b)img.save("inverted.jpg")# 灰度变换(自定义公式,如加权平均)
gray_pixels = gray_img.load()
for x in range(width):for y in range(height):gray_value = int(0.299 * r + 0.587 * g + 0.114 * b) # 标准灰度公式gray_pixels[x, y] = gray_value
3. 边缘检测(简单实现)
通过卷积核检测边缘(如 Sobel 算子):
import numpy as np
from PIL import ImageFilter# 使用 Pillow 内置的边缘检测滤镜(更高效)
edge_img = img.filter(ImageFilter.FIND_EDGES)
edge_img.save("edges.jpg")# 自定义 Sobel 算子(需转换为数组操作)
def sobel_edge_detection(pil_img):img_array = np.array(pil_img.convert("L")) # 转灰度图数组kernel_x = np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]])kernel_y = np.array([[-1, -2, -1], [0, 0, 0], [1, 2, 1]])# 卷积计算梯度gradient_x = convolve2d(img_array, kernel_x, mode="same")gradient_y = convolve2d(img_array, kernel_y, mode="same")gradient = np.sqrt(gradient_x**2 + gradient_y**2)# 归一化到 0-255edge_array = (gradient / gradient.max() * 255).astype(np.uint8)return Image.fromarray(edge_array)sobel_img = sobel_edge_detection(img)
sobel_img.save("sobel_edges.jpg")
五、高级应用:与其他工具结合与性能优化
目标:解决实际问题(如批量处理、格式兼容、与其他库协作)。
1. 处理透明通道(RGBA 模式)
# 创建带透明度的 PNG
img = Image.new("RGBA", (200, 200), (255, 0, 0, 128)) # 红色,半透明
draw = ImageDraw.Draw(img)
draw.rectangle((50, 50, 150, 150), fill=(0, 255, 0, 200)) # 绿色矩形
img.save("transparent.png")
2. 批量处理与性能优化
- •生成缩略图集:遍历文件夹,为所有图片生成缩略图。
- •多线程处理:使用
concurrent.futures
加速批量操作。
from concurrent.futures import ThreadPoolExecutordef process_image(input_path):img = Image.open(input_path)img.thumbnail((300, 300))img.save(f"thumbs/{os.path.basename(input_path)}")with ThreadPoolExecutor(max_workers=4) as executor:executor.map(process_image, ["images/" + f for f in os.listdir("images")])
3. 与 OpenCV 协作
Pillow 与 OpenCV 数据格式不同(Pillow 是 RGB
,OpenCV 是 BGR
),需转换:
import cv2
import numpy as np# Pillow → OpenCV
pil_img = Image.open("input.jpg")
opencv_img = np.array(pil_img)[:, :, ::-1] # RGB 转 BGR# OpenCV → Pillow
cv2_img = cv2.imread("input.jpg")
pil_img = Image.fromarray(cv2.cvtColor(cv2_img, cv2.COLOR_BGR2RGB))
总结:学习路径
安装验证→基础操作(开/存/转)→核心编辑(裁/缩/旋/粘)→增强分析(亮度/边缘)→高级协作(跨库/性能)→实战项目→源码贡献。