使用 imageio 库轻松处理图像与视频

使用 imageio 库轻松处理图像与视频

imageio 是一个 Python 库,用于读取和写入多种图像和视频格式。它功能强大、易于使用,广泛应用于图像处理、视频编辑和数据可视化等领域。本篇文章将介绍 imageio 的基础功能、常见用法以及高级操作。


一、安装 imageio

在使用 imageio 之前,需要确保已安装库。可以通过以下命令安装:

pip install imageio

如果需要支持额外的格式(如读取视频或特殊图像格式),可能需要安装插件,如 imageio[ffmpeg]

pip install imageio[ffmpeg]

二、基础功能
1. 读取和写入图像

imageio 支持多种图像格式,包括 PNG、JPEG、BMP、TIFF 等。

  • 读取图像
import imageio.v3 as iio# 读取图像文件
image = iio.imread('example.jpg')print(type(image))  # <class 'numpy.ndarray'>
print(image.shape)  # 图像维度 (height, width, channels)
  • 写入图像
# 保存图像到文件
iio.imwrite('output.png', image)
2. 显示图像

可以结合其他可视化库(如 Matplotlib)显示图像:

import matplotlib.pyplot as pltplt.imshow(image)
plt.axis('off')  # 隐藏坐标轴
plt.show()

三、处理视频文件

imageio 提供了方便的视频读取和写入功能。

  • 读取视频帧
video_reader = iio.imiter('example.mp4')for frame in video_reader:print(frame.shape)  # 每帧的形状break  # 仅查看第一帧
  • 写入视频文件
frames = [image, image]  # 示例帧列表
iio.imwrite('output.mp4', frames, fps=30)

四、插件支持

imageio 的强大功能来源于其插件架构。通过安装不同插件,可以扩展支持的格式。例如:

  • 安装 imageio[ffmpeg] 以支持 MP4 等视频格式。
  • 使用 imageio[openexr] 支持 EXR 图像。

五、进阶功能
1. 动态 GIF 的读取与生成
  • 读取 GIF
gif = iio.imread('example.gif', plugin='pillow')
print(gif.shape)  # 多帧图像
  • 生成 GIF
frames = [image, image]  # 示例帧列表
iio.imwrite('output.gif', frames, loop=1)
2. 图像格式转换

通过读取和保存,可以轻松实现格式转换:

image = iio.imread('example.tiff')
iio.imwrite('converted.jpg', image)
3. 高分辨率图像处理

对于超大图像,可以使用内存友好的流式读取:

with iio.imopen('large_image.tiff', 'r') as file:for block in file.iter_blocks(size=(1024, 1024)):print(block.shape)  # 每个块的形状

六、常见问题与解决方案
  1. 读取视频时遇到插件错误
    确保安装了 ffmpeg 支持:

    pip install imageio[ffmpeg]
    
  2. 保存图像时颜色不一致
    使用 imageio.v3 版本时,颜色通道顺序为 RGB,而一些旧插件可能默认 BGR。请确保正确处理颜色通道:

    import numpy as nprgb_image = np.flip(image, axis=-1)  # 将 BGR 转换为 RGB
    iio.imwrite('corrected.jpg', rgb_image)
    

七、基础总结

imageio 是处理图像和视频的多面手,尤其适合需要快速实现功能的场景。它的简单接口和强大的插件支持让用户可以轻松地操作图像与视频文件。从基础的读取与写入,到进阶的动态 GIF 生成和大图流式处理,imageio 提供了强大的功能。

八、进阶实战案例

下面将展示一些基于 imageio 的实战场景,包括图像批量处理、视频帧提取与编辑,以及动态视觉化案例。


案例 1:批量处理图像(如批量缩放或格式转换)

在处理大批量图像时,imageio 提供了高效的方法。

目标:将一个目录下所有图像文件转换为 PNG 格式,并调整尺寸为 224x224。

import os
import imageio.v3 as iio
from PIL import Imagedef process_images(input_dir, output_dir, size=(224, 224)):if not os.path.exists(output_dir):os.makedirs(output_dir)for filename in os.listdir(input_dir):if filename.endswith(('.jpg', '.jpeg', '.png', '.bmp', '.tiff')):file_path = os.path.join(input_dir, filename)# 读取图像image = iio.imread(file_path)# 使用 PIL 调整尺寸image_resized = Image.fromarray(image).resize(size)# 保存为 PNG 格式output_path = os.path.join(output_dir, os.path.splitext(filename)[0] + '.png')iio.imwrite(output_path, image_resized)print(f"Processed: {output_path}")# 示例用法
process_images('input_images', 'output_images')

案例 2:视频帧提取与合成

在计算机视觉项目中,常需要对视频进行帧提取、处理后再重新合成为视频。

目标:将视频每帧提取为图像,应用灰度处理后重新合成视频。

import imageio.v3 as iio
import numpy as npdef process_video(input_video, output_video):# 提取帧frames = list(iio.imiter(input_video))print(f"Total frames extracted: {len(frames)}")# 灰度处理gray_frames = [np.mean(frame, axis=-1).astype(np.uint8) for frame in frames]# 合成新视频iio.imwrite(output_video, gray_frames, fps=30)print(f"Processed video saved as: {output_video}")# 示例用法
process_video('input_video.mp4', 'output_video.mp4')

案例 3:生成动态图像(GIF 动画)

动态图像(GIF)常用于展示机器学习模型的推理结果或数据变化。

目标:创建一个动态 GIF,展示图像逐渐模糊的过程。

import imageio.v3 as iio
from scipy.ndimage import gaussian_filterdef create_blur_gif(input_image, output_gif, steps=10):# 读取输入图像image = iio.imread(input_image)frames = []for sigma in range(steps):# 添加不同模糊程度的帧blurred = gaussian_filter(image, sigma=sigma)frames.append(blurred)# 保存为 GIFiio.imwrite(output_gif, frames, loop=1, duration=0.2)print(f"Blur animation saved as: {output_gif}")# 示例用法
create_blur_gif('example.jpg', 'blur_animation.gif')

案例 4:处理超大图像文件

在遥感、医学影像等领域,经常会遇到超大图像文件。通过块处理,可以节省内存占用。

目标:对超大图像的每个块应用亮度增强操作。

import imageio.v3 as iio
import numpy as npdef process_large_image(input_file, output_file, block_size=(1024, 1024)):with iio.imopen(input_file, "r") as reader, iio.imopen(output_file, "w") as writer:writer.init_from_file(reader)  # 初始化输出图像的格式for block in reader.iter_blocks(size=block_size):# 增强亮度(乘以1.2,但不超过255)processed_block = np.clip(block * 1.2, 0, 255).astype(np.uint8)writer.write(processed_block)print(f"Processed large image saved as: {output_file}")# 示例用法
process_large_image('large_image.tiff', 'enhanced_image.tiff')

案例 5:实时视频处理与显示

通过结合 imageioOpenCV,可以实现实时视频处理和显示,适用于监控、实时检测等场景。

目标:实时捕获视频流,添加时间戳并显示。

import imageio.v3 as iio
import cv2
from datetime import datetimedef process_live_video(output_video):# 打开摄像头cap = cv2.VideoCapture(0)writer = iio.imopen(output_video, "w", plugin="FFMPEG", fps=30)while cap.isOpened():ret, frame = cap.read()if not ret:break# 添加时间戳timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')cv2.putText(frame, timestamp, (10, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)# 显示视频cv2.imshow('Live Video', frame)# 写入帧writer.write(frame)# 按 'q' 键退出if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()writer.close()cv2.destroyAllWindows()print(f"Live video saved as: {output_video}")# 示例用法
process_live_video('live_output.mp4')

总结与展望

通过以上案例可以看出,imageio 的功能可以涵盖从基础图像处理到复杂视频编辑等多种任务。其简单易用的接口和强大的插件支持,能有效满足实际项目的需求。

在未来的应用中,可以结合深度学习框架(如 TensorFlow、PyTorch)使用 imageio 进行数据预处理;或结合大规模分布式系统处理超大数据集,挖掘更多潜力。

希望本文的内容能帮助你更高效地利用 imageio,如果有任何问题或建议,欢迎留言讨论!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/890032.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

乐凡信息智能安全管控方案:助力油气田行业安全管控多方位升级

我国油田地域广阔&#xff0c;分布着大量各种油井&#xff0c;油井开采设备的连续稳定运行是保证石油开采的首要条件。然而&#xff0c;由于油田多位于特殊地理环境中&#xff0c;因而实现油井之间的通信首要问题就是要克服地理环境所带来的限制&#xff0c;传统通信系统的建设…

windows 使用python共享网络给另外一个网卡

# -*- coding: utf-8 -*- import subprocessdef open_share(to_shared_adapter, from_shared_adapter):"""打开以太网的网络共享:return: None"""powershell_script f"""# Register the HNetCfg library (once)# regsvr32 hnetc…

深度学习实战智能交通计数

本文采用YOLOv8作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。YOLOv8以其高效的实时检测能力&#xff0c;在多个目标检测任务中展现出卓越性能。本研究针对车辆目标数据集进行训练和优化&#xff0c;该数据集包含丰富的车辆目标图像样本…

rebase ‘A‘ onto ‘master‘ 和 merge ‘master‘ into ‘A‘有什么区别

在Git版本控制系统中&#xff0c;rebase 和 merge 是两种不同的操作&#xff0c;用于合并分支。rebase A onto master 和 merge master into A 虽然最终目的都是将两个分支的更改合并在一起&#xff0c;但它们在处理方式和结果上有所不同。 rebase ‘A’ onto ‘master’ 含义…

MySQL Explain 分析SQL语句性能

一、EXPLAIN简介 使用EXPLAIN关键字可以模拟优化器执行SQL查询语句&#xff0c;从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。 &#xff08;1&#xff09; 通过EXPLAIN&#xff0c;我们可以分析出以下结果&#xff1a; 表的读取顺序数据读取…

关于SAP Router连接不稳定的改良

这个也是网上看来的&#xff0c;之前在用的时候也在想是不是建立一个长连接&#xff0c;就不至于断线。今天正好看到。 关于SAP Router连接不稳定的改良 我们在使用SAPRouter时经常会碰到断线&#xff0c;其发生原因有很多&#xff0c;如&#xff1a;网络不稳定、操作间隔时间…

游泳溺水识别数据集,对9984张原始图片进行YOLO,COCO JSON, VOC XML 格式的标注,平均识别率在91.7%以上

游泳溺水识别数据集&#xff1a; 对9984张原始图片进行YOLO&#xff0c;COCO JSON, VOC XML 格式的标注&#xff0c;平均识别率在91.7&#xff05;以上 &#xff0c;可识别泳池或者水库中是否有人溺水。 数据集分割 训练组98&#xff05; 9818图片 有效集&#xff05;…

Docker的容器编排

目录 1. 什么是容器编排&#xff08;Docker Compose&#xff09;2. 容器编排的功能3. 容器编排文件&#xff08;docker-compose.yml&#xff09;的介绍3.1 文件语法版本3.2 文件基本结构及常见指令 4. Docker Compose命令详解4.1 Docker Compose命令清单4.2 命令格式和常见选项…

Type 类型 总结

GetType、Typeof Type 官网资料 IsAssignableFrom IsAssignableTo 在C#中&#xff0c;Type.IsAssignableFrom方法用于判断一个类型是否可以从另一个类型赋值。它检查源类型是否是目标类型的基类或接口。 isAssignableFrom(Class<?> c) 标识 “当前Class 是否是给定…

温度传感器DS18B20详解

前面我们学习 DHT11 的时候提到了 DS18B20&#xff0c;它有很宽的测温范围&#xff0c;-55C ~ 125C。那么本次我们就来详细介绍一下 DS18B20。 DS18B20 是一种单总线数字温度传感器&#xff0c;它被广泛应用于各种领域&#xff0c;例如气象监测、室内温度控制、工业自动化等。…

基于MNE的EEGNet 神经网络的脑电信号分类实战(附完整源码)

利用MNE中的EEG数据&#xff0c;进行EEGNet神经网络的脑电信号分类实现&#xff1a; 代码&#xff1a; 代码主要包括一下几个步骤&#xff1a; 1&#xff09;从MNE中加载脑电信号&#xff0c;并进行相应的预处理操作&#xff0c;得到训练集、验证集以及测试集&#xff0c;每个…

LM芯片学习

1、LM7805稳压器 https://zhuanlan.zhihu.com/p/626577102?utm_campaignshareopn&utm_mediumsocial&utm_psn1852815231102873600&utm_sourcewechat_sessionhttps://zhuanlan.zhihu.com/p/626577102?utm_campaignshareopn&utm_mediumsocial&utm_psn18528…

2025山东科技大学考研专业课复习资料一览

[冲刺]2025年山东科技大学020200应用经济学《814经济学之西方经济学[宏观部分]》考研学霸狂刷870题[简答论述计算题]1小时前[强化]2025年山东科技大学085600材料与化工《817物理化学》考研强化检测5套卷22小时前[冲刺]2025年山东科技大学030100法学《704综合一[法理学、国际法学…

vue自定义颜色选择器(重置版)

实现效果 相较于上次发布的颜色选择器&#xff0c;这次加入了圆形的选择器&#xff0c;并且优化了代码。 <SquareColor ref"squareColor" :color"color" change"changeColor1" />setColor1() {// this.color rgba(255, 82, 111, 0.5)thi…

timestamp 时间戳转换成日期的方法 | java.util

时间戳通常是一个long数据&#xff08;注意java中赋值时需要带上L标识是long整型&#xff0c;否则int过长报错&#xff09; 代码实现 常用工具类&#xff1a; java.util.Datejava.time.Instantjava.time.format.DateTimeFormatter toInstant() 方法的功能是将一个 Date 对象…

Minio入门搭建图片服务器

Minio入门搭建图片服务器 闲来无事&#xff0c;之前一直想弄弄图片服务器的软件&#xff0c;搜索了一下有zimg、Nginx、Thumbor、Minio等。想想之前也用过minio&#xff0c;所以就用这个搭建啦。 1. docker安装 docker run -d -p 9000:9000 -p 9001:9001 \ …

从腾讯云的恶意文件查杀学习下PHP的eval函数

问题来自于腾讯云的主机安全通知&#xff1a; &#x1f680;一键接入&#xff0c;畅享GPT及AI大模型服务&#xff01;【顶级API中转品牌】&#xff1a; https://api.ablai.top/ 病毒文件副本内容如下&#xff1a; <?php function x($x){eval($x);}x(str_rot13(riny($_CBF…

CISC RISC

CISC&#xff1a;设计目标是通过复杂的指令来提高代码密度&#xff0c;减少指令数量&#xff0c;适合内存资源较为有限的系统。CISC处理器的硬件复杂度较高&#xff0c;但在某些应用场合&#xff08;如桌面计算机&#xff09;能够提供足够的性能。 RISC&#xff1a;设计目标是…

使用LSTM神经网络对股票日线行情进行回归训练(Pytorch版)

版权声明&#xff1a;本文为博主原创文章&#xff0c;如需转载请贴上原博文链接&#xff1a;使用LSTM神经网络对股票日线行情进行回归训练&#xff08;Pytorch版&#xff09;-CSDN博客 前言&#xff1a;近期在尝试使用lstm对股票日线数据进行拟合&#xff0c;初见成型但是效果不…

睡岗和玩手机数据集,4653张原始图,支持YOLO,VOC XML,COCO JSON格式的标注

睡岗和玩手机数据集&#xff0c;4653张原始图&#xff0c;支持YOLO&#xff0c;VOC XML&#xff0c;COCO JSON格式的标注 数据集分割 训练组70&#xff05; 3257图片 有效集20&#xff05; 931图片 测试集10&#xff05; 465图片 预处理 没有采用任何预处…