文章目录
- pip install imageio 如果需要视频处理功能(例如读取 MP4 或 AVI 文件),建议同时安装 ffmpeg 插件: pip install imageio[ffmpeg] 提示:在某些 Linux 系统中,ffmpeg 可能需要额外通过包管理器安装,例如: sudo apt install ffmpeg
- 下面是最基础的读写操作示例: import imageio.v3 as iio # 读取图像 img = iio.imread(‘example.jpg’) print(img.shape) # 输出 (height, width, channels) # 保存图像 iio.imwrite(‘output.png’, img) imageio.v3 是 ImageIO 3.x 版本中推荐的全新 API 模块,拥有更简洁的函数命名与统一接口。旧版本中可用: import imageio img = imageio.imread(‘example.jpg’) 但建议今后都使用 imageio.v3。
- ImageIO 在内部使用 NumPy 数组 来表示图像数据。例如,一张 24 位 RGB 图像会被读取为: img.shape -> (H, W, 3) img.dtype -> uint8 这意味着你可以直接使用 NumPy 的矩阵运算、切片操作来处理图像,而无需额外转换。 灰度图像(单通道)则是 (H, W) 的二维数组。
- ImageIO 会根据文件扩展名(或 MIME type)自动选择对应插件,如: 格式 插件 支持读 支持写 PNG Pillow ✅ ✅ JPEG Pillow ✅ ✅ GIF Pillow / FFmpeg ✅ ✅ TIFF tifffile ✅ ✅ MP4 FFmpeg ✅ ✅ DICOM imageio-dicom ✅ ✅ 可通过以下方式查看支持的格式: import imageio print(imageio.formats)
- import imageio.v3 as iio img = iio.imread(“photo.png”) print(img.shape) 如果是灰度图: img = iio.imread(“photo.png”, mode=’L’) ImageIO 也支持从 URL、内存字节流、相机设备中读取: import requests from io import BytesIO url = “https://example.com/sample.jpg” response = requests.get(url) img = iio.imread(BytesIO(response.content))
- 保存文件非常简单: iio.imwrite(“output.jpg”, img) 支持设置压缩质量: iio.imwrite(“output.jpg”, img, quality=90) 保存为灰度图: iio.imwrite(“gray.png”, img.mean(axis=2).astype(‘uint8’))
- frames = iio.imread(“animation.gif”, index=None) print(len(frames)) # 输出帧数 index=None 表示读取全部帧。 每一帧都是一个 NumPy 数组,你可以逐帧操作或提取。
- 将多帧合成为 GIF: images = [] for i in range(10): frame = np.full((100, 100, 3), i*25, dtype=np.uint8) images.append(frame) iio.imwrite(“animation.gif”, images, duration=0.1) 参数说明: duration:每帧播放时间(秒) loop:循环次数(默认 0 表示无限循环)
- ImageIO 通过 ffmpeg 插件支持视频帧流读取。 import imageio.v3 as iio reader = iio.imiter(“video.mp4”) for frame in reader: print(frame.shape) 或者直接读取所有帧: frames = list(iio.imread(“video.mp4”)) 如果视频很长,建议逐帧读取以节省内存。
- frames = [iio.imread(f”frames/frame_{i}.png”) for i in range(30)] iio.imwrite(“output.mp4”, frames, fps=25) 注意:生成 MP4 时必须安装 ffmpeg,否则会报错。
- import imageio.v3 as iio reader = iio.imiter(“movie.mp4″) for i, frame in enumerate(reader): if i % 10 == 0: iio.imwrite(f”frame_{i:04d}.jpg”, frame) 上例中每隔 10 帧保存一张图片,相当于视频抽帧。
- 因为返回值本身就是 NumPy 数组,可以直接使用矩阵操作: import numpy as np gray = img.mean(axis=2).astype(np.uint8) iio.imwrite(‘gray.png’, gray)
- OpenCV 读写图像是 BGR 顺序,而 ImageIO 是 RGB。 可以相互转换: import cv2 img_bgr = cv2.cvtColor(img, cv2.COLOR_RGB2BGR) cv2.imwrite(‘cv_output.jpg’, img_bgr)
- from PIL import Image pil_img = Image.fromarray(img) pil_img.show() 这在需要结合 ImageDraw、ImageFont 等高级绘制功能时非常有用。
- 当处理大型视频或多张图像时,不建议一次性加载: reader = iio.imiter(“bigvideo.mp4”) for frame in reader: process(frame) 这样能避免内存溢出。
- 使用 quality 控制 JPEG 压缩比; 结合 Pillow 插件时,可使用 optimize=True; 对频繁读取的文件,可结合 functools.lru_cache 缓存。
- 可以借助 concurrent.futures: from concurrent.futures import ThreadPoolExecutor files = [‘a.jpg’, ‘b.jpg’, ‘c.jpg’] with ThreadPoolExecutor() as pool: imgs = list(pool.map(iio.imread, files))
- import os, imageio.v3 as iio input_dir = ‘jpg_images’ output_dir = ‘png_images’ os.makedirs(output_dir, exist_ok=True) for file in os.listdir(input_dir): if file.endswith(‘.jpg’): img = iio.imread(os.path.join(input_dir, file)) new_name = os.path.splitext(file)[0] + ‘.png’ iio.imwrite(os.path.join(output_dir, new_name), img)
- import numpy as np import imageio.v3 as iio for i, frame in enumerate(iio.imiter(“input.mp4″)): gray = frame.mean(axis=2).astype(np.uint8) iio.imwrite(f”frames/frame_{i:04d}.png”, gray)
- import glob frames = [iio.imread(f) for f in sorted(glob.glob(“frames/*.png”))] iio.imwrite(“output.mp4”, frames, fps=30)
目录
- 一、前言
- 二、安装与快速入门
- 1. 安装
- 2. 快速入门
- 三、ImageIO 的核心机制与数据模型
- 1. 数据表示:NumPy 数组为核心
- 2. 图像格式自动识别
- 四、图像读写操作详解
- 1. 读取图像
- 2. 写入图像
- 五、动态图像(GIF)读写
- 1. 读取 GIF
- 2. 写入 GIF
- 六、视频文件处理
- 1. 读取视频帧
- 2. 写入视频
- 3. 视频剪切与抽帧示例
- 七、与 NumPy / OpenCV / Pillow 的协作
- 1. 与 NumPy 的协作
- 2. 与 OpenCV 的协作
- 3. 与 Pillow 的协作
- 八、性能优化与大文件处理技巧
- 1. 使用懒加载(Lazy Reading)
- 2. 压缩与缓存优化
- 3. 并行批量读取
- 九、插件机制:可扩展的多格式体系
- 十、实战案例
- 案例 1:批量图像格式转换
- 案例 2:视频帧提取与灰度处理
- 案例 3:帧合成为视频
- 十一、ImageIO v3 新特性
- 十二、常见错误与调试技巧
- 十三、应用场景与生态整合
- 十四、总结与展望
在现代图像处理与计算机视觉项目中,我们几乎无时无刻不需要与图像文件或视频数据打交道。无论是读取一张照片、保存图像处理结果,还是从视频中提取帧序列,这些操作的第一步都是高效、正确地读写图像数据。
在 Python 生态中,我们常见的图像 I/O 工具有:
OpenCV(cv2)——功能强大,但偏重计算机视觉;Pillow(PIL)——经典图像库,操作灵活但不支持视频;matplotlib.image——用于科研绘图,不适合批量 I/O;- 而
imageio,正是它们之间的轻量级、通用型图像与视频输入输出解决方案。
imageio 是一个跨平台、跨格式的图像和视频 I/O 库。它支持数十种文件格式(如 PNG、JPEG、TIFF、GIF、MP4、DICOM 等),并与 NumPy 无缝集成,是深度学习、科学计算、医学影像、视频分析等场景下的理想选择。
本文将深入讲解:
- ImageIO 的安装与核心原理
- 图像、GIF、视频的读写
- 与 NumPy、OpenCV、Pillow 的协同使用
- 插件系统与性能优化
- 实际案例:视频帧提取、帧合成、批量图像转换
- 以及一些容易被忽略的高级特性
阅读完本文后,你将全面掌握 imageio 的使用方法与原理。
pip install imageio
如果需要视频处理功能(例如读取 MP4 或 AVI 文件),建议同时安装 ffmpeg 插件:
pip install imageio[ffmpeg]
提示:在某些 Linux 系统中,ffmpeg 可能需要额外通过包管理器安装,例如:
sudo apt install ffmpeg
下面是最基础的读写操作示例:
import imageio.v3 as iio
# 读取图像
img = iio.imread('example.jpg')
print(img.shape) # 输出 (height, width, channels)
# 保存图像
iio.imwrite('output.png', img)
imageio.v3 是 ImageIO 3.x 版本中推荐的全新 API 模块,拥有更简洁的函数命名与统一接口。旧版本中可用:
import imageio
img = imageio.imread('example.jpg')
但建议今后都使用 imageio.v3。
ImageIO 在内部使用 NumPy 数组 来表示图像数据。
例如,一张 24 位 RGB 图像会被读取为:
img.shape -> (H, W, 3) img.dtype -> uint8
这意味着你可以直接使用 NumPy 的矩阵运算、切片操作来处理图像,而无需额外转换。
灰度图像(单通道)则是 (H, W) 的二维数组。
ImageIO 会根据文件扩展名(或 MIME type)自动选择对应插件,如:
| 格式 | 插件 | 支持读 | 支持写 |
|---|---|---|---|
| PNG | Pillow | ✅ | ✅ |
| JPEG | Pillow | ✅ | ✅ |
| GIF | Pillow / FFmpeg | ✅ | ✅ |
| TIFF | tifffile | ✅ | ✅ |
| MP4 | FFmpeg | ✅ | ✅ |
| DICOM | imageio-dicom | ✅ | ✅ |
可通过以下方式查看支持的格式:
import imageio print(imageio.formats)
import imageio.v3 as iio
img = iio.imread("photo.png")
print(img.shape)
如果是灰度图:
img = iio.imread("photo.png", mode='L')
ImageIO 也支持从 URL、内存字节流、相机设备中读取:
import requests from io import BytesIO url = "https://example.com/sample.jpg" response = requests.get(url) img = iio.imread(BytesIO(response.content))
保存文件非常简单:
iio.imwrite("output.jpg", img)
支持设置压缩质量:
iio.imwrite("output.jpg", img, quality=90)
保存为灰度图:
iio.imwrite("gray.png", img.mean(axis=2).astype('uint8'))
GIF 动图是 imageio 的一大亮点。
frames = iio.imread("animation.gif", index=None)
print(len(frames)) # 输出帧数
index=None 表示读取全部帧。
每一帧都是一个 NumPy 数组,你可以逐帧操作或提取。
将多帧合成为 GIF:
images = []
for i in range(10):
frame = np.full((100, 100, 3), i*25, dtype=np.uint8)
images.append(frame)
iio.imwrite("animation.gif", images, duration=0.1)
参数说明:
duration:每帧播放时间(秒)loop:循环次数(默认 0 表示无限循环)
ImageIO 通过 ffmpeg 插件支持视频帧流读取。
import imageio.v3 as iio
reader = iio.imiter("video.mp4")
for frame in reader:
print(frame.shape)
或者直接读取所有帧:
frames = list(iio.imread("video.mp4"))
如果视频很长,建议逐帧读取以节省内存。
frames = [iio.imread(f"frames/frame_{i}.png") for i in range(30)]
iio.imwrite("output.mp4", frames, fps=25)
注意:生成 MP4 时必须安装 ffmpeg,否则会报错。
注意:生成 MP4 时必须安装 ffmpeg,否则会报错。
import imageio.v3 as iio
reader = iio.imiter("movie.mp4")
for i, frame in enumerate(reader):
if i % 10 == 0:
iio.imwrite(f"frame_{i:04d}.jpg", frame)
上例中每隔 10 帧保存一张图片,相当于视频抽帧。
ImageIO 是一个中间层,可以与其他图像库无缝衔接。
因为返回值本身就是 NumPy 数组,可以直接使用矩阵操作:
import numpy as np
gray = img.mean(axis=2).astype(np.uint8)
iio.imwrite('gray.png', gray)
OpenCV 读写图像是 BGR 顺序,而 ImageIO 是 RGB。
可以相互转换:
import cv2
img_bgr = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
cv2.imwrite('cv_output.jpg', img_bgr)
from PIL import Image
pil_img = Image.fromarray(img)
pil_img.show()
这在需要结合 ImageDraw、ImageFont 等高级绘制功能时非常有用。
当处理大型视频或多张图像时,不建议一次性加载:
reader = iio.imiter("bigvideo.mp4")
for frame in reader:
process(frame)
这样能避免内存溢出。
- 使用
quality 控制 JPEG 压缩比;
- 结合 Pillow 插件时,可使用
optimize=True;
- 对频繁读取的文件,可结合
functools.lru_cache 缓存。
quality 控制 JPEG 压缩比;optimize=True;functools.lru_cache 缓存。
可以借助 concurrent.futures:
from concurrent.futures import ThreadPoolExecutor
files = ['a.jpg', 'b.jpg', 'c.jpg']
with ThreadPoolExecutor() as pool:
imgs = list(pool.map(iio.imread, files))
imageio 的强大之处在于它的插件架构。
每种格式(如 PNG、GIF、MP4)都是独立的插件,可单独升级或替换。
查看已安装插件:
import imageio print(imageio.plugins)
安装额外插件(例如 DICOM 医学影像):
pip install imageio[dicom]
你也可以自定义插件,注册自定义格式解析器。
import os, imageio.v3 as iio
input_dir = 'jpg_images'
output_dir = 'png_images'
os.makedirs(output_dir, exist_ok=True)
for file in os.listdir(input_dir):
if file.endswith('.jpg'):
img = iio.imread(os.path.join(input_dir, file))
new_name = os.path.splitext(file)[0] + '.png'
iio.imwrite(os.path.join(output_dir, new_name), img)
import numpy as np
import imageio.v3 as iio
for i, frame in enumerate(iio.imiter("input.mp4")):
gray = frame.mean(axis=2).astype(np.uint8)
iio.imwrite(f"frames/frame_{i:04d}.png", gray)
import glob
frames = [iio.imread(f) for f in sorted(glob.glob("frames/*.png"))]
iio.imwrite("output.mp4", frames, fps=30)
imageio.v3 是新版的统一接口,具有以下优点:
| 旧版 | 新版(推荐) | 功能 |
|---|---|---|
imageio.imread() |
iio.imread() |
读取图像 |
imageio.mimread() |
iio.imread(index=None) |
读取多帧 |
imageio.get_reader() |
iio.imiter() |
流式读取 |
imageio.get_writer() |
iio.imwrite() |
写入文件 |
这些函数都支持路径、URL、二进制流输入。
| 问题 | 原因 | 解决方案 |
|---|---|---|
Cannot read file |
路径或格式错误 | 检查文件路径与后缀 |
FFmpeg not found |
未安装插件 | pip install imageio[ffmpeg] |
| 输出图像颜色异常 | BGR/RGB 混用 | 使用 cv2.cvtColor() 转换 |
| GIF 无法播放 | duration 过短或帧格式错误 | 调整 duration 参数 |
ImageIO 已被众多项目集成使用,包括:
- scikit-image:作为底层 I/O 引擎
- Napari:科学图像可视化工具
- PyTorch 数据集预处理:读取视频帧序列
- 医学影像(DICOM)分析
- AI 模型推理前处理
如果你的任务涉及多媒体 I/O,ImageIO 几乎总能派上用场。
imageio 是一个兼具 简洁性、可扩展性与高性能 的图像与视频 I/O 库。
它的设计理念是 “让图像读写像读写文件一样简单”。
本文回顾了它的主要特性:
- ✅ 支持几十种主流格式
- ✅ 与 NumPy 无缝集成
- ✅ 同时支持静态图与视频帧
- ✅ 插件化架构、可扩展性强
- ✅ 新版 API 更统一、简洁
未来版本的 imageio 还计划增加 GPU 加速与异步流处理等特性,使其在 AI、视觉计算、医学影像领域发挥更大作用。
无论你是刚入门的 Python 图像开发者,还是深度学习工程师,掌握 imageio 都能让你的数据处理流程更加高效、清晰、优雅。
以上就是Python使用ImageIO库实现从图像到视频的高效读写的详细内容,更多关于Python ImageIO图像视频高效读写的资料请关注风君子博客其它相关文章!
您可能感兴趣的文章:
- Python使用imageio库处理图像与视频的操作详解
- Python imageio读取视频并进行编解码详解
- Python读取视频的两种方法(imageio和cv2)