原文链接:http://www.juzicode.com/python-module-imageio
imageio是Python的多媒体处理库,支持读取和写入100+种图像/视频格式,提供统一的API处理静态图像、视频流等图像数据,适用于科学可视化和跨格式数据处理场景。
应用场景
- 视频帧提取与处理
- 动态GIF生成
- 显微镜图像序列处理
- 跨格式媒体转换
- 视频转码
安装与导入
# juzicode.com/VX公众号:juzicode
pip install imageio[ffmpeg]
import imageio as iio
使用方法
1. 读取图像元数据
下面的例子演示如何读取图像的基本属性和元数据。
# juzicode.com/VX公众号:juzicode
import imageio as iio
# 使用内置示例图像
with iio.imopen('neza.jpg', 'r') as img:
data = img.read()
print(data.shape)
print(data.dtype)
运行结果:
(510, 892, 3)
uint8
2. 视频帧提取
逐帧读取视频文件并保存关键帧。使用iio.get_reader创建视频读取器,通过迭代器获取帧数据。适用于视频分析预处理场景。
# juzicode.com/VX公众号:juzicode
import imageio as iio
reader = iio.get_reader('jerry.mp4')
for i, frame in enumerate(reader):
if i % 30 == 0: # 每30帧保存一帧
iio.imwrite(f'frame_{i:04d}.png', frame)
reader.close()
运行结果:
生成frame_0000.png, frame_0030.png等文件
3. 创建动态GIF
将多张图像合并为动态GIF。通过duration参数控制帧率(毫秒/帧),loop设置循环次数(0为无限循环)。适用于生成进度动画或数据可视化。
# juzicode.com/VX公众号:juzicode
import numpy as np
import imageio as iio
frames = [np.random.randint(0,255,(100,100,3), dtype=np.uint8)
for _ in range(10)]
iio.mimsave('random.gif', frames, duration=0.2, loop=0)
运行结果:
生成10帧随机噪声动画GIF
4. 视频转码处理
将视频转换为灰度并降低帧率。通过ffmpeg参数控制编码质量,适用于视频压缩和预处理场景。
# juzicode.com/VX公众号:juzicode
import imageio as iio
import numpy as np
reader = iio.get_reader('input.mp4')
writer = iio.get_writer(
'output.avi',
fps=15,
codec='libx264',
macro_block_size=8,
ffmpeg_params=['-crf', '25']
)
for frame in reader:
gray = np.dot(frame[...,:3], [0.299, 0.587, 0.114])
writer.append_data(gray.astype(np.uint8))
reader.close()
writer.close()
运行结果:
生成15FPS的灰度压缩视频
5. 流式处理大文件
分块读取巨型图像文件,避免内存溢出。使用imiter实现迭代式读取,适用于超大文件处理。
# juzicode.com/VX公众号:juzicode
import imageio as iio
with iio.imopen('huge.tif', 'r') as img:
for chunk in img.iter():
print(chunk)
运行结果:
分块处理1024x1024像素区域
6. 多维度数据保存
存储带空间标度的3D体数据。通过meta参数保存像素尺寸信息,适用于科学数据可视化。
# juzicode.com/VX公众号:juzicode
import imageio as iio
import numpy as np
data = np.random.randn(100, 100, 100).astype(np.float32)
meta = {'spacing': (0.5, 0.5, 1.0)} # (x,y,z) 单位mm
iio.volwrite('volume.tiff', data, metadata=meta)
运行结果:
生成包含空间标度的TIFF体数据文件
7. 实时屏幕录制
使用mss捕获屏幕内容并实时编码。通过调整region参数选择录制区域,适用于制作软件操作教程。
# juzicode.com/VX公众号:juzicode
from mss import mss
import imageio as iio
import numpy as np
with mss() as sct, iio.get_writer('screenrec.mp4', fps=15) as writer:
monitor = sct.monitors[1] # 主显示器
for _ in range(60): # 录制60帧
img = sct.grab(monitor)
writer.append_data(np.array(img))
运行结果:
生成4秒的屏幕录制视频(15FPS)
总结
imageio为多媒体处理提供统一接口:
- 支持广泛的图像/视频格式
- 提供流式处理大文件能力
- 集成科学数据存储标准
- 简化视频处理流程