当前位置: 首页 > news >正文

基于python opencv 多进程处理图像

在Python中使用OpenCV进行图像处理时,由于图像数据通常较大,单进程处理可能会面临性能瓶颈。为了提升处理速度,我们可以利用多进程(multiprocessing)来并行处理图像。多进程可以充分利用多核CPU的计算资源,每个进程在独立的内存空间中运行,从而避免GIL(全局解释器锁)对性能的影响(尽管GIL主要影响多线程在CPython中的性能)。

下面是一个使用Python的multiprocessing库和OpenCV来并行处理图像的基本示例。我们将定义一个函数来处理图像(例如,将图像转换为灰度),然后使用multiprocessing.Pool来并行地处理一个图像列表。

步骤 1: 导入必要的库

import cv2
from multiprocessing import Pool
import numpy as np

步骤 2: 定义图像处理函数

该函数将作为多进程池中的工作单元。

def process_image(image_path):# 读取图像img = cv2.imread(image_path)if img is None:return None# 转换为灰度图像gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 可以在这里添加更多的图像处理步骤return gray

步骤 3: 准备图像列表

准备你想要处理的图像文件的路径列表。

image_paths = ['path/to/image1.jpg', 'path/to/image2.jpg', 'path/to/image3.jpg']

步骤 4: 使用多进程池处理图像

def main():with Pool(processes=4) as pool:  # 设定进程池中的进程数# map函数将image_paths列表中的每个元素作为参数传递给process_image函数,并返回结果列表results = pool.map(process_image, image_paths)# 遍历结果并显示或保存处理后的图像for result in results:if result is not None:cv2.imshow('Processed Image', result)cv2.waitKey(0)cv2.destroyAllWindows()# 如果需要,可以在这里保存图像# cv2.imwrite('processed_image.jpg', result)if __name__ == '__main__':main()

注意:

  • cv2.imshowcv2.waitKey 在多进程环境中可能会遇到问题,因为它们是GUI操作且依赖于主线程。在实际应用中,你可能需要将处理后的图像数据发送回主进程进行显示或保存。
  • 上述示例中,cv2.imshow 实际上只在最后一个图像上有效,因为窗口会立即关闭。为了查看所有图像,你可能需要调整代码来逐个显示它们,或者将所有处理后的图像保存到文件中。
  • 当你处理大量图像或非常大的图像时,请确保你的系统有足够的内存来处理多个图像副本。
  • 对于更复杂的图像处理任务,你可能需要考虑使用更高级的并行处理框架,如Dask或Ray,这些框架提供了更丰富的数据并行和任务调度的功能。

完整代码

from PIL import Image, ImageDraw, ImageFont
import datetime
import random
import os
import glob
from multiprocessing import Pool
random.seed(2024)def process_image(image_full_path):# 如果需要保存图片到文件image.save(os.path.join(label_path,image_name))
if __name__ == '__main__':# 读取图片image_path = 'data/label/*.*'  # 图片路径image_list=glob.glob(image_path)with Pool(processes=16) as pool:  # 设定进程池中的进程数# map函数将image_paths列表中的每个元素作为参数传递给process_image函数,并返回结果列表results = pool.map(process_image, image_list)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 你了解你的GD32 MCU系统主频是多少吗 ?
  • 什么是反射以及反射的应用及例子
  • 14、如何⽤DDD设计微服务代码模型
  • [Armbian] 部署Docker版Home Assistent,安装HACS并连接米家设备
  • SimD~
  • 数据结构之树知识总结
  • 快速搞定分布式RabbitMQ---RabbitMQ进阶与实战
  • 【C++笔试强训】day02
  • Android SurfaceFlinger——纹理的绘制流程(二十八)
  • Activiti 6 兼容openGauss数据库bytes类型不匹配
  • Linux 某进程 CPU 高问题,用 Shell 脚本发现处理
  • go标准库---net/http服务端
  • 被工信部认可的开源软件治理解决方案
  • 高级及架构师高频面试题-应用型
  • 实战:MyBatis适配多种数据库:MySQL、Oracle、PostGresql等
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • gulp 教程
  • JavaScript新鲜事·第5期
  • Java应用性能调优
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • webpack入门学习手记(二)
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 分布式熔断降级平台aegis
  • 讲清楚之javascript作用域
  • 浏览器缓存机制分析
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 项目实战-Api的解决方案
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • 如何用纯 CSS 创作一个货车 loader
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ​学习笔记——动态路由——IS-IS中间系统到中间系统(报文/TLV)​
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • #考研#计算机文化知识1(局域网及网络互联)
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (第27天)Oracle 数据泵转换分区表
  • (转)http-server应用
  • (转载)(官方)UE4--图像编程----着色器开发
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • .bashrc在哪里,alias妙用
  • .bat批处理出现中文乱码的情况
  • .gitignore文件忽略的内容不生效问题解决
  • .NET BackgroundWorker
  • .net core 6 集成和使用 mongodb
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .Net程序帮助文档制作
  • .NET序列化 serializable,反序列化
  • .Net中的设计模式——Factory Method模式
  • /bin/bash^M: bad interpreter: No such file or directory
  • @DataRedisTest测试redis从未如此丝滑
  • [].slice.call()将类数组转化为真正的数组