图像处理入门|第八部分:Python生态与实战应用 (Ecosystem & Applications)
欢迎来到Python的“数字暗房”与“视觉实验室”!图像在现代应用中无处不在,从社交媒体的滤镜到自动驾驶汽车的障碍物识别。Python凭借其丰富的库,成为了图像处理和计算机视觉领域的主力语言之一。
本章,我们将入门两个该领域最核心的库:
- Pillow: 它是从经典的PIL (Python Imaging Library) 库发展而来的一个更友好、更现代的分支。Pillow专注于基础的图像操作,你可以把它想象成一个可以通过代码控制的“轻量级Photoshop”。它能帮你轻松完成裁剪、缩放、旋转、滤镜、添加文字等任务。
- OpenCV-Python: 这是一个功能极其强大的计算机视觉 (Computer Vision, CV) 库。它的目标不仅仅是处理图像,更是要让计算机能够“看懂”图像。OpenCV提供了从基础图像处理到高级视觉分析(如人脸识别、物体跟踪、特征检测)的数千种算法。
本章将带你使用Pillow完成常见的图像编辑任务,并初步领略OpenCV的强大功能。
开始前的准备:
在命令行/终端中安装这两个库:
# Pillow 的包名叫 pillow
pip install pillow
# OpenCV-Python 的包名叫 opencv-python
pip install opencv-python
你还需要准备一张图片(例如 cat.jpg
)放在你的项目目录下用于实验。
24.1 Pillow: 基础图像操作
Pillow的核心是 Image
模块,它代表了一个图像对象。所有的操作都围绕这个对象展开。
from PIL import Image, ImageFilter, ImageDraw, ImageFont
# --- 1. 打开和显示图片 ---
try:
# 打开图片,返回一个 Image 对象
img = Image.open('cat.jpg')
# 显示图片信息
print(f"图片格式: {img.format}")
print(f"图片尺寸: {img.size}") # (宽度, 高度)
print(f"图片模式: {img.mode}") # 'RGB', 'L' (灰度), 'RGBA' (带透明度)
# 显示图片 (这会调用系统默认的图片查看器)
# img.show()
except FileNotFoundError:
print("错误:请确保 'cat.jpg' 文件在当前目录下。")
exit()
# --- 2. 图像基本操作 ---
# a) 裁剪图片 (crop)
# 参数是一个四元组 (left, upper, right, lower)
box = (100, 100, 400, 400) # 定义一个从 (100, 100) 到 (400, 400) 的矩形区域
cropped_img = img.crop(box)
cropped_img.save('cat_cropped.jpg') # 保存处理后的图片
print("图片已裁剪并保存为 cat_cropped.jpg")
# b) 缩放图片 (resize)
# 参数是一个元组 (width, height)
resized_img = img.resize((200, 200))
resized_img.save('cat_resized.jpg')
print("图片已缩放并保存为 cat_resized.jpg")
# c) 旋转图片 (rotate)
# 参数是逆时针旋转的角度
rotated_img = img.rotate(90)
rotated_img.save('cat_rotated.jpg')
print("图片已旋转并保存为 cat_rotated.jpg")
# d) 转换为灰度图 (convert)
grayscale_img = img.convert('L')
grayscale_img.save('cat_grayscale.jpg')
print("图片已转为灰度图并保存为 cat_grayscale.jpg")
# --- 3. 应用滤镜 ---
# 使用 ImageFilter 模块
blurred_img = img.filter(ImageFilter.BLUR)
blurred_img.save('cat_blurred.jpg')
print("图片已应用模糊滤镜并保存为 cat_blurred.jpg")
# --- 4. 在图片上绘制图形和文字 ---
# 为了不影响原图,我们复制一份
drawing_img = img.copy()
# 创建一个 Draw 对象
draw = ImageDraw.Draw(drawing_img)
# 绘制一个矩形 (左上角和右下角坐标)
draw.rectangle([(100, 100), (400, 400)], outline="red", width=5)
# 绘制文字
# 可能需要指定字体文件路径,否则可能无法显示中文或使用默认字体
# font = ImageFont.truetype("arial.ttf", 36)
draw.text((50, 50), "Hello, Pillow!", fill="white")
drawing_img.save('cat_with_drawing.jpg')
print("图片已添加绘图和文字并保存为 cat_with_drawing.jpg")
运行这段代码,你的项目目录下会生成一系列处理过的新图片。
24.2 OpenCV-Python: 计算机视觉应用简介
OpenCV (Open Source Computer Vision Library) 是一个跨平台的计算机视觉库。它在图像处理、视频分析、机器学习等领域有着极其广泛的应用。
与Pillow不同,OpenCV读取的图像在内部是以NumPy数组的形式存储的,这使得它能与Python数据科学生态(NumPy, SciPy, Matplotlib)无缝集成。另外,Open-CV的颜色通道顺序默认是 BGR(蓝绿红),而不是常见的RGB。
案例:使用OpenCV进行人脸检测
这是一个经典的计算机视觉入门案例。我们将使用OpenCV自带的预训练好的级联分类器 (Cascade Classifier) 来检测图片中的人脸。
准备工作:
你需要一个预训练好的模型文件,通常是 .xml
格式。OpenCV官方仓库提供了很多,最常用的是 haarcascade_frontalface_default.xml
。你需要从网上下载这个文件,并放到你的项目目录中。
import cv2
import matplotlib.pyplot as plt # 使用 matplotlib 来显示图片,因为它能更好地在Jupyter等环境中工作
# --- 1. 读取图片 ---
# cv2.imread() 读取的图片是 BGR 格式的 NumPy 数组
img_bgr = cv2.imread('cat.jpg') # 假设我们的图片里有人脸,这里用猫图做演示,实际应换成人脸图
if img_bgr is None:
print("错误:图片未能加载,请检查路径和文件是否损坏。")
exit()
# 将 BGR 转换为灰度图,因为人脸检测通常在灰度图上进行,效率更高
img_gray = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY)
# --- 2. 加载人脸检测分类器 ---
# 确保你已经下载了 haarcascade_frontalface_default.xml 文件
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# --- 3. 执行人脸检测 ---
# detectMultiScale 会返回一个矩形列表,每个矩形代表一个检测到的人脸
# (x, y, w, h) -> 左上角坐标x, y,以及矩形的宽度w和高度h
faces = face_cascade.detectMultiScale(
img_gray,
scaleFactor=1.1, # 每次图像缩小的比例
minNeighbors=5, # 每个候选矩形需要保留的邻近个数
minSize=(30, 30) # 人脸的最小尺寸
)
print(f"在这张图片中找到了 {len(faces)} 张人脸。")
# --- 4. 在原图上绘制矩形框出人脸 ---
for (x, y, w, h) in faces:
# 在 BGR 原图上绘制矩形
# 参数:图片,左上角坐标,右下角坐标,颜色(BGR),线条宽度
cv2.rectangle(img_bgr, (x, y), (x+w, y+h), (0, 255, 0), 2) # (0, 255, 0) 是绿色
# --- 5. 显示结果 ---
# 因为 cv2 的颜色是 BGR,而 matplotlib 是 RGB,所以需要转换一下
img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)
plt.figure(figsize=(8, 6))
plt.imshow(img_rgb)
plt.title('Face Detection Result')
plt.axis('off') # 不显示坐标轴
plt.show()
# 或者使用OpenCV自己的窗口显示 (在普通脚本中更常用)
# cv2.imshow('Detected Faces', img_bgr)
# cv2.waitKey(0) # 等待用户按键
# cv2.destroyAllWindows() # 关闭所有窗口
如果你用一张包含清晰人脸的图片来运行这段代码,你将看到所有被检测到的人脸都被绿色的矩形框标记了出来。这只是OpenCV强大功能的冰山一角,它还可以用于视频中的实时人脸识别、物体跟踪、手势识别等等。
太酷了!你现在已经掌握了用Python来“看”和“编辑”世界的基本技能。你学会了:
- 使用 Pillow 进行日常的图像编辑任务,如裁剪、缩放和添加滤镜。
- 初步了解了 OpenCV 的工作方式,并成功实现了一个经典的人脸检测应用。
你已经具备了开发自动化图像处理脚本、或者为你的应用添加基本计算机视觉功能的能力。
在下一章,我们将进入一个非常实用和有趣的领域:自动化脚本。你将学习如何让Python程序模拟人类的操作,比如定时执行任务、控制鼠标键盘、自动抓取网页信息等,真正让Python成为你的“私人助理”。准备好,让你的电脑为你自动工作吧!