1. 程式人生 > >OpenCV中對split的優化方法

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