OpenCV中對split的優化方法
阿新 • • 發佈:2018-11-17
目錄
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