OpenCV中对split的优化方法

目录

1.问题

2.思路

3.实现

4.资料


 

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

      

 

猜你喜欢

转载自blog.csdn.net/qiao_lili/article/details/83591218