imageio~多媒体处理专家

原文链接: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为多媒体处理提供统一接口:

  • 支持广泛的图像/视频格式
  • 提供流式处理大文件能力
  • 集成科学数据存储标准
  • 简化视频处理流程

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注