python-guide 图像处理实战指南:Pillow 与 OpenCV 双库上手
【免费下载链接】python-guidePython best practices guidebook, written for humans.项目地址: https://gitcode.com/gh_mirrors/py/python-guide
本篇指南源自 python-guide(The Hitchhiker's Guide to Python)仓库中的图像处理场景章节,面向需要在 Python 中完成图片读取、显示、滤镜、通道拆分、EXIF 读取与灰度转换等日常任务的开发者。读完本文,你将掌握 Pillow(PIL 的活跃继任者)与 OpenCV 两套主流图像处理库的安装方式、核心 API 用法,以及如何根据任务复杂度选择最合适的库。
为什么 Python 里图像处理只需要两个库
在 Python 生态中,绝大多数图像处理与图像编辑需求都可以用两个库高效完成:Python Imaging Library(PIL)和Open Source Computer Vision(OpenCV,开源计算机视觉库)。前者侧重日常图像编辑与格式转换,后者则是更进阶的图像分析与计算机视觉工具。python-guide 将这份选型建议收录在 场景指南(Scenario Guide for Python Applications)中,作为scenarios/imaging一章向开发者推荐。
下文分别介绍两个库的背景、安装步骤与可直接运行的代码示例。
Python Imaging Library(PIL)与 Pillow
PIL 是 Python 图像处理的核心库之一,但它的官方开发早已停滞——最后一个正式版本发布于 2009 年。幸运的是,社区孵化了一个持续活跃的复刻分支Pillow:它安装更简单、支持所有主流操作系统,并且完整支持 Python 3。因此,新项目应当直接使用 Pillow,而不是原版 PIL。
安装 Pillow
安装 Pillow 之前,需要先满足其平台相关的底层依赖(例如不同系统上的 JPEG、PNG、zlib 等图像编解码库),请参照 Pillow 官方安装文档中针对你所在平台(Windows / macOS / Linux)的说明完成前置准备。
前置依赖就绪后,安装本身只有一条命令:
$ pip install PillowPillow 与 PIL 共用PIL这一模块名,因此安装 Pillow 后,代码中依然通过from PIL import ...导入。
入门示例:读取、显示、滤镜、通道拆分与 EXIF
以下示例完整覆盖了日常图像编辑的高频操作:打开图片、显示图片、应用滤镜、保存新文件、拆分 RGB 通道以及读取 EXIF 元数据:
from PIL import Image, ImageFilter # 读取图像 im = Image.open('image.jpg') # 显示图像(会调用系统默认图片查看器) im.show() # 对图像应用锐化滤镜,返回一张新的 Image 对象 im_sharp = im.filter(ImageFilter.SHARPEN) # 将处理后的图像保存为 JPEG 格式的新文件 im_sharp.save('image_sharpened.jpg', 'JPEG') # 将图像拆分为各自的颜色通道,RGB 模式下即红、绿、蓝三个单通道 r, g, b = im_sharp.split() # 查看图像中内嵌的 EXIF 数据(相机型号、光圈、快门、拍摄时间等) exif_data = im._getexif() exif_data逐行解读关键 API:
Image.open(path):打开图片文件,返回Image对象。Pillow 会根据文件内容自动识别格式,无需显式指定。im.show():调用系统默认图片查看器展示图片,适合交互式调试。im.filter(ImageFilter.SHARPEN):Pillow 内置多种滤镜(如BLUR、CONTOUR、EMBOSS、SHARPEN、SMOOTH等),处理返回新对象,原图不被修改。im_sharp.save('image_sharpened.jpg', 'JPEG'):按指定格式写出文件;第二个参数为格式名(如'JPEG'、'PNG'、'GIF'),也可省略以由扩展名推断。im_sharp.split():将多通道图像拆成独立的单通道图像,RGB 图像得到 (r, g, b) 三元组。im._getexif():返回内嵌 EXIF 元数据字典,若图片无 EXIF 则返回None。
更多 Pillow 用法可查阅官方 Pillow 教程(Handbook),其中包含裁剪、旋转、缩放、缩略图、模式转换(如convert('L')转灰度)等进阶操作。
Open Source Computer Vision(OpenCV)
Open Source Computer Vision,通称OpenCV,是比 PIL 更进阶的图像处理与计算机视觉软件,底层以 C/C++ 实现、性能出色,已被多种编程语言绑定并广泛应用于学术界与工业界。它适合人脸检测、物体识别、图像特征提取、视频分析等计算密集型任务。
安装:cv2 与 NumPy
在 Python 中使用 OpenCV,实际上用到的是cv2与NumPy两个模块:cv2是 OpenCV 的 Python 绑定,而NumPy提供底层数组结构——OpenCV 的图像在 Python 中就是一个 NumPy 数组,这为矩阵运算与批量像素处理提供了极大便利。OpenCV 的安装配置请参考其官方安装指南;NumPy 可以直接从 Python 包索引(PyPI)安装:
$ pip install numpy入门示例:读取、显示、灰度转换与保存
以下示例演示 OpenCV 处理图像的标准流程:读取图片、弹出窗口显示、按键后关闭窗口、转换灰度并保存:
import cv2 # 读取图像 img = cv2.imread('testimg.jpg') # 显示图像(在 GUI 窗口中展示) cv2.imshow('image', img) # 等待用户按键,参数 0 表示无限期等待直到按下任意键 cv2.waitKey(0) # 关闭所有由 OpenCV 创建的窗口 cv2.destroyAllWindows() # 将图像应用灰度滤镜,从 BGR 色彩空间转换为灰度 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 将灰度图像保存到新文件 cv2.imwrite('graytest.jpg', gray)关键 API 说明:
cv2.imread(path):读取图像,返回一个 NumPy 数组。注意 OpenCV 默认以BGR(而非 RGB)通道顺序加载彩色图像,这是与 Pillow 的一个重要差异。cv2.imshow(window_name, img):在指定名称的窗口中显示图像,仅支持窗口环境(桌面 GUI),无头服务器环境下不可用。cv2.waitKey(ms):等待键盘输入,参数为毫秒数,0表示无限等待;返回按键的 ASCII 码。它在显示循环中同时负责刷新窗口事件。cv2.destroyAllWindows():关闭所有已创建的 OpenCV 窗口,释放资源。cv2.cvtColor(img, cv2.COLOR_BGR2GRAY):执行色彩空间转换,COLOR_BGR2GRAY表示 BGR 转灰度。cv2.imwrite(path, img):将 NumPy 数组形式的图像写出为文件,格式由文件扩展名决定。
由于cv2图像本质是 NumPy 数组,你还可以直接对其进行切片、算术运算、逻辑掩码等操作,实现阈值分割、直方图均衡、边缘检测(如 Canny)等高级功能。OpenCV 官方及社区有大量 Python 实现的教程示例可供进一步学习。
两个库如何选型
| 维度 | Pillow | OpenCV |
|---|---|---|
| 定位 | 日常图像编辑与格式转换 | 计算机视觉与进阶图像分析 |
| 安装复杂度 | 低(pip install Pillow,需少量平台依赖) | 中(cv2绑定 +NumPy,按官方指南配置) |
| 图像表示 | 自有的PIL.Image对象 | NumPy 数组(默认 BGR 通道顺序) |
| 典型场景 | 缩略图、滤镜、格式转换、EXIF 读取 | 灰度/色彩空间转换、特征检测、视频分析、机器学习预处理 |
| 性能取向 | 常规编辑足够 | 面向大规模像素运算优化,适合计算密集任务 |
简单来说:做图像编辑、格式处理、快速加滤镜,选 Pillow;做计算机视觉、需要把图像当 NumPy 数组做数值运算、或对接机器学习流程,选 OpenCV。两者也能互补——例如先用 Pillow 做轻量预处理,再用 OpenCV 提取特征。
仓库中的定位与进一步探索
本章节是 python-guide 中 场景指南(Scenario Guide for Python Applications)的一部分,与数据库、网络、科学计算、机器学习等场景章节并列,遵循“按场景给最佳实践选型”的写作理念。仓库使用 Sphinx 构建文档(见 docs/conf.py),scenarios/imaging.rst即本章节源文件;配套的示例照片存放于 docs/_static/photos 目录,可作为测试图像处理流程的真实素材。
如果你想继续深入,仓库中与之相邻的科学计算章节介绍了 NumPy、SciPy、Matplotlib 等科学计算栈,其中的 NumPy 数组操作与 OpenCV 的图像数组模型一脉相承;而机器学习章节展示了如何将图像数据接入 scikit-learn 等训练流程。图像处理往往是这些更复杂应用的前置环节,掌握 Pillow 与 OpenCV 之后,你可以自然衔接到这些进阶方向。
【免费下载链接】python-guidePython best practices guidebook, written for humans.项目地址: https://gitcode.com/gh_mirrors/py/python-guide
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考