C++、C#、python调用OpenCV进行图像处理耗时对比
- 一、前言
- 二、环境介绍
- 三、耗时对比
- 3.1读写jpg、bmp图片耗时对比
- 3.2灰度化、阈值分割、膨胀腐蚀耗时对比
- 附录
- (1)imread函数以不同模式读取图片
- (2)OpenCV读取图片格式与PIL读取图片格式区别
一、前言
图像处理算法库中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 |
对表中数据进行分析:
- python与C++读写图片的耗时基本一致,而C#读取图片的耗时约为二者的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 |
从表中数据可分析得出:
- python、C#、C++ 在灰度化、阈值分割、膨胀腐蚀三种算法上三种语言耗时基本一致,C#膨胀腐蚀的耗时高出二者50%;
- 先膨胀再腐蚀与直接进行闭运算耗时一致,与理论相符。
附录
(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
计算结果会四舍五入保留为整数。
这种加权公式的依据为:
- 绿色权重最大,因为人眼对绿色最敏感。
- 蓝色权重最小,因为人眼对蓝色不太敏感。