目录
1.问题
问题源于:http://answers.opencv.org/question/109754/optimizing-splitmerge-for-clahe/
具体:
提问者在做限制性对比度图像增强算法时,需要进行HSV的通道分离,但是由于原图的像素点太多以至于使用split方法分离的时间效率并不高,那么如何提高split通道分离的性能呢?
提问者的源代码如下:
cv::cvtColor(rgb, hsv, cv::COLOR_BGR2HSV);
std::vector<cv::Mat> hsvChannels;
cv::split(hsv, hsvChannels);
m_clahe->apply(hsvChannels[2], hsvChannels[2]); /* m_clahe constructed outside loop */
cv::merge(hsvChannels, hsvOut);
cv::cvtColor(hsvOut, rgbOut, cv::COLOR_HSV2BGR)
2.思路
回答者给出了一组新的函数,对单独的通道进行处理和合并函数:
extractChannel()
insertChannel()
使用方法:
extractChannel(hsv1, hsvChannels2, 2);
clahe->apply(hsvChannels2, hsvChannels2);
insertChannel(hsvChannels2, hsv1, 2);
同时,opencv的计时方法:
//定义计时器
TickMeter tm;
//启动
tm.start();
//代码段
...
//结束
tm.stop();
//输出
cout<<tm<<endl;
//重置
tm.reset():
CLAHE的公用函数:
3.实现
实验图像:
实验代码:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main()
{
//设置CLAHE参数
Ptr<CLAHE> clahe = createCLAHE();
clahe->setClipLimit(4);
//图像转化
Mat arm = imread("arm.jpg");
Mat armHSV1;
Mat armHSV2;
vector<Mat>planes(3);
cvtColor(arm,armHSV1,CV_BGR2HSV);
cvtColor(arm, armHSV2, CV_BGR2HSV);
//定义计时函数
TickMeter tm;
//方法1:
tm.start();
for (int i = 0; i < 1000; i++)
{
split(armHSV1, planes);
clahe->apply(planes[2], planes[2]);
merge(planes, armHSV1);
}
tm.stop();
cout << tm << endl;
tm.reset();
//方法2:
tm.start();
for (int i = 0; i < 1000; i++)
{
extractChannel(armHSV2,planes[2],2);
clahe->apply(planes[2], planes[2]);
insertChannel(planes[2],armHSV2,2);
}
tm.stop();
cout << tm << endl;
return 0;
}
结果:
方法1应用1000次共耗时: 8.00326s
方法2应用1000次共耗时:6.50826s