目录

CCpython调用OpenCV进行图像处理耗时对比

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

一、前言

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

二、环境介绍

编程语言/OpenCV版本
python3.7.10
opencv-python-headless4.10.0.84
C#.NET Framework4.7.2——C# 7.3
opencvsharp4.10.0.20241108
C++VS2019——C++14
opencv4.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图片耗时对比

-pythonC#C++
imread-彩色图jpg0.026s0.067s0.026s
imread-灰度图jpg0.008s0.045s0.009s
imread-彩色图bmp0.011s0.043s0.011s
imread-灰度图bmp0.005s0.038s0.006s
imwrite-彩色图jpg0.045s0.050s0.036s
imwrite-灰度图jpg0.026s0.027s0.023s
imwrite-彩色图bmp0.007s0.007s0.007s
imwrite-灰度图bmp0.003s0.003s0.003s

对表中数据进行分析:

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

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

-pythonC#C++
cvtColor-转灰度0.004s0.005s0.010s
threshold-Otsu0.004s0.004s0.004s
dilate + erode0.069s0.095s0.065s
morphologyEx-闭运算0.069s0.095s0.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轴为宽度方向,如下图所示:

https://i-blog.csdnimg.cn/direct/2ea29a65cbbb4e8caa792976aa821993.png#pic_center

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

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

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

这种加权公式的依据为:

  1. 绿色权重最大,因为 人眼对绿色最敏感 。
  2. 蓝色权重最小,因为人眼对蓝色不太敏感。