C++、C#、python调用OpenCV进行图像处理耗时对比

C++、C#、python调用OpenCV进行图像处理耗时对比

一、前言

图像处理算法库中OpenCV是比较常用的算法库,可使用不同语言进行调用编写算法,常用的语言有C++、C#、python,本文主要对比了不同语言调用OpenCV进行图像读取、图像保存、图像灰度化、图像腐蚀与膨胀、OTSU分割几种常用的图像处理操作,耗费的时间长短,为在图像处理算法的编程语言选择上提供一些参考。

二、环境介绍

编程语言/OpenCV 版本
python 3.7.10
opencv-python-headless 4.10.0.84
C# .NET Framework4.7.2------C# 7.3
opencvsharp 4.10.0.20241108
C++ VS2019------C++14
opencv 4.10.0

其中opencv-python-headless为python调用的包,opencv-python-headless是opencv-python的轻量版本,仅包含用于图像处理的核心模块。

opencvsharp是C#调用的软件库,是第三方开发的适配C#的OpenCV。

C++调用的opencv是从官网下载的官方版本。

三种编程语言调用的opencv统一为4.10.0版本,发布日期为2024-06-03。

三、耗时对比

图像处理操作对象图片为500万像素图片。

3.1读写jpg、bmp图片耗时对比

- python C# C++
imread-彩色图jpg 0.026s 0.067s 0.026s
imread-灰度图jpg 0.008s 0.045s 0.009s
imread-彩色图bmp 0.011s 0.043s 0.011s
imread-灰度图bmp 0.005s 0.038s 0.006s
imwrite-彩色图jpg 0.045s 0.050s 0.036s
imwrite-灰度图jpg 0.026s 0.027s 0.023s
imwrite-彩色图bmp 0.007s 0.007s 0.007s
imwrite-灰度图bmp 0.003s 0.003s 0.003s

对表中数据进行分析:

  1. python与C++读写图片的耗时基本一致,而C#读取图片的耗时约为二者的3倍以上,写入图片的速度基本一致;
  2. 读写灰度图像的耗时约为读写彩色图像的一半;
  3. jpg图片写入耗时约为bmp图像的6倍,读取耗时约为bmp图像的1倍。

3.2灰度化、阈值分割、膨胀腐蚀耗时对比

- python C# C++
cvtColor-转灰度 0.004s 0.005s 0.010s
threshold-Otsu 0.004s 0.004s 0.004s
dilate + erode 0.069s 0.095s 0.065s
morphologyEx-闭运算 0.069s 0.095s 0.065s

从表中数据可分析得出:

  1. python、C#、C++ 在灰度化、阈值分割、膨胀腐蚀三种算法上三种语言耗时基本一致,C#膨胀腐蚀的耗时高出二者50%;
  2. 先膨胀再腐蚀与直接进行闭运算耗时一致,与理论相符。

附录

(1)imread函数以不同模式读取图片

OpenCV读取图片使用的imread函数,可通过指定第二个参数以不同模式读取图片:

参数值 含义
1或IMREAD_COLOR(默认参数) 将图像调整为3通道BGR图像,即使图片是灰度图
0或IMREAD_GRAYSCALE 将图像调整为灰度图像
-1或IMREAD_UNCHANGED 保持原格式不变,深度、通道数都不变
2或IMREAD_ANYDEPTH 保持原始位深度,例如16位或32位,不强制转换为8位,但可能会转换通道数
4或IMREAD_ANYCOLOR 保持原始通道数不变,但可能会压缩图片深度为8位

(2)OpenCV读取图片格式与PIL读取图片格式区别

OpenCV的imread函数读取图片后的通道顺序为BGR,PIL库的Image类读取图片后的通道顺序为RGB,二者读取图片的坐标原点为左上角,x轴为高度方向,y轴为宽度方向,如下图所示:

OpenCV的imread函数以IMREAD_GRAYSCALE读取彩色图片时,会将图像强制转换为灰度图,这种转换过程遵循特定的加权平均法,公式如下:

Gray=0.114×B+0.587×G+0.299×R

计算结果会四舍五入保留为整数。

这种加权公式的依据为:

  1. 绿色权重最大,因为人眼对绿色最敏感。
  2. 蓝色权重最小,因为人眼对蓝色不太敏感。
相关推荐
PP东17 分钟前
Pyhton基础之多继承、多态
开发语言·python
一只鱼^_26 分钟前
牛客周赛 Round 108
数据结构·c++·算法·动态规划·图论·广度优先·推荐算法
北岛三生26 分钟前
Camera tuning flow相机调试流程
图像处理·数码相机·测试工具·模块测试
菜鸟的日志44 分钟前
【音频字幕】构建一个离线视频字幕生成系统:使用 WhisperX 和 Faster-Whisper 的 Python 实现
python·whisper·音视频
小宁爱Python1 小时前
基于 Django+Vue3 的 AI 海报生成平台开发(海报模块专项)
人工智能·python·django
红豆怪怪2 小时前
[LeetCode 热题 100] 32. 最长有效括号
数据结构·python·算法·leetcode·动态规划·代理模式
愚润求学2 小时前
【贪心算法】day6
c++·算法·leetcode·贪心算法
沐怡旸2 小时前
【底层机制】右值引用是什么?为什么要引入右值引用?
c++·面试
大嘴带你水论文2 小时前
震惊!仅用10张照片就能随意编辑3D人脸?韩国KAIST最新黑科技FFaceNeRF解析!
论文阅读·人工智能·python·科技·计算机视觉·3d·transformer
CodeCraft Studio2 小时前
国产化PDF处理控件Spire.PDF教程:如何在 Java 中通过模板生成 PDF
java·python·pdf·spire.pdf·java创建pdf·从html创建pdf