From 21d9c47bd00499b8a65cbc8edf4b56a296d73280 Mon Sep 17 00:00:00 2001 From: shimat Date: Wed, 7 Mar 2018 20:20:45 +0900 Subject: [PATCH] Optimize decolor in photo (#10997) * optimized cv::decolor by removing vector.push_back * restored CV_INSTRUMENT_REGION() and original indent * fix build warnings in contrast_preserve.hpp * undo refactoring contrast_preserve.cpp/hpp --- modules/photo/src/contrast_preserve.cpp | 36 +++---- modules/photo/src/contrast_preserve.hpp | 126 +++++++++++------------- 2 files changed, 77 insertions(+), 85 deletions(-) diff --git a/modules/photo/src/contrast_preserve.cpp b/modules/photo/src/contrast_preserve.cpp index 8c6caedbdf..ce31e0cd26 100644 --- a/modules/photo/src/contrast_preserve.cpp +++ b/modules/photo/src/contrast_preserve.cpp @@ -82,7 +82,7 @@ void cv::decolor(InputArray _src, OutputArray _dst, OutputArray _color_boost) vector Cg; vector < vector > polyGrad; - vector < vector < int > > comb; + vector comb; vector alf; @@ -103,11 +103,11 @@ void cv::decolor(InputArray _src, OutputArray _dst, OutputArray _color_boost) iterCount +=1; pre_E = E; - vector G_pos; - vector G_neg; + vector G_pos(alf.size()); + vector G_neg(alf.size()); - vector temp; - vector temp1; + vector temp(polyGrad[0].size()); + vector temp1(polyGrad[0].size()); double val = 0.0; for(unsigned int i=0;i< polyGrad[0].size();i++) @@ -115,8 +115,8 @@ void cv::decolor(InputArray _src, OutputArray _dst, OutputArray _color_boost) val = 0.0; for(unsigned int j =0;j EXPsum; - vector EXPterm; + vector EXPsum(G_pos.size()); + vector EXPterm(G_pos.size()); for(unsigned int i = 0;i temp2; + vector temp2(EXPsum.size()); for(unsigned int i=0;i wei1; + vector wei1(polyGrad.size()); for(unsigned int i=0;i< polyGrad.size();i++) { @@ -158,7 +158,7 @@ void cv::decolor(InputArray _src, OutputArray _dst, OutputArray _color_boost) { val1 = val1 + (Mt.at(i,j) * EXPterm[j]); } - wei1.push_back(val1); + wei1[i] = val1; } for(unsigned int i =0;i product(vector < vector > &comb, vector &initRGB); + vector product(vector &comb, const double initRGB[3]); double energyCalcu(vector &Cg, vector < vector > &polyGrad, vector &wei); void singleChannelGradx(const Mat &img, Mat& dest); void singleChannelGrady(const Mat &img, Mat& dest); void gradvector(const Mat &img, vector &grad); void colorGrad(Mat img, vector &Cg); - void add_vector(vector < vector > &comb, int &idx, int r,int g,int b); + void add_vector(vector &comb, int &idx, int r,int g,int b); void add_to_vector_poly(vector < vector > &polyGrad, vector &curGrad, int &idx1); void weak_order(Mat img, vector &alf); void grad_system(Mat img, vector < vector < double > > &polyGrad, - vector < double > &Cg, vector < vector >& comb); + vector < double > &Cg, vector & comb); void wei_update_matrix(vector < vector > &poly, vector &Cg, Mat &X); - void wei_inti(vector < vector > &comb, vector &wei); + void wei_inti(vector &comb, vector &wei); void grayImContruct(vector &wei, Mat img, Mat &Gray); }; @@ -83,25 +83,26 @@ int round_num(double a) double Decolor::energyCalcu(vector &Cg, vector < vector > &polyGrad, vector &wei) { - vector energy; - vector temp; - vector temp1; + const size_t size = polyGrad[0].size(); + vector energy(size); + vector temp(size); + vector temp1(size); double val = 0.0; - for(unsigned int i=0;i< polyGrad[0].size();i++) + for(size_t i=0;i< polyGrad[0].size();i++) { val = 0.0; - for(unsigned int j =0;j Decolor::product(vector < vector > &comb, vector &initRGB) +vector Decolor::product(vector &comb, const double initRGB[3]) { - vector res; + vector res(comb.size()); double dp; - for (unsigned int i=0;i &grad) { - Mat dest= Mat(img.size().height,img.size().width, CV_32FC1); - Mat dest1= Mat(img.size().height,img.size().width, CV_32FC1); + Mat dest; + Mat dest1; singleChannelGradx(img,dest); singleChannelGrady(img,dest1); @@ -167,21 +168,22 @@ void Decolor::gradvector(const Mat &img, vector &grad) int height = d_trans.size().height; int width = d_trans.size().width; + grad.resize(width * height * 2); + for(int i=0;i(i,j)); + grad[i*height + j] = d_trans.at(i, j); + const int offset = width * height; for(int i=0;i(i,j)); - dest.release(); - dest1.release(); + grad[offset + i * height + j] = d1_trans.at(i, j); } void Decolor::colorGrad(Mat img, vector &Cg) { - Mat lab = Mat(img.size(),CV_32FC3); + Mat lab; cvtColor(img,lab,COLOR_BGR2Lab); @@ -196,32 +198,24 @@ void Decolor::colorGrad(Mat img, vector &Cg) gradvector(lab_channel[1],Ima); gradvector(lab_channel[2],Imb); + Cg.resize(ImL.size()); double res =0.0; - for(unsigned int i=0;i > &comb, int &idx, int r,int g,int b) +void Decolor::add_vector(vector &comb, int &idx, int r,int g,int b) { - comb.push_back( vector () ); - comb.at(idx).push_back( r ); - comb.at(idx).push_back( g ); - comb.at(idx).push_back( b ); + comb.push_back(Vec3i(r, g, b)); idx++; } void Decolor::add_to_vector_poly(vector < vector > &polyGrad, vector &curGrad, int &idx1) { - polyGrad.push_back( vector () ); - for(unsigned int i=0;i &alf) split(img,rgb_channel); vector Rg, Gg, Bg; - vector t1, t2, t3; - vector tmp1, tmp2, tmp3; - gradvector(rgb_channel[2],Rg); gradvector(rgb_channel[1],Gg); gradvector(rgb_channel[0],Bg); + vector t1(Rg.size()), t2(Rg.size()), t3(Rg.size()); + vector tmp1(Rg.size()), tmp2(Rg.size()), tmp3(Rg.size()); + double level = .05; for(unsigned int i=0;i level) - t1.push_back(1.0); + t1[i] = 1.0; else - t1.push_back(0.0); + t1[i] = 0.0; if(Gg[i] > level) - t2.push_back(1.0); + t2[i] = 1.0; else - t2.push_back(0.0); + t2[i] = 0.0; if(Bg[i] > level) - t3.push_back(1.0); + t3[i] = 1.0; else - t3.push_back(0.0); + t3[i] = 0.0; if(Rg[i] < -1.0*level) - tmp1.push_back(1.0); + tmp1[i] = 1.0; else - tmp1.push_back(0.0); + tmp1[i] = 0.0; if(Gg[i] < -1.0*level) - tmp2.push_back(1.0); + tmp2[i] = 1.0; else - tmp2.push_back(0.0); + tmp2[i] = 0.0; if(Bg[i] < -1.0*level) - tmp3.push_back(1.0); + tmp3[i] = 1.0; else - tmp3.push_back(0.0); + tmp3[i] = 0.0; } - for(unsigned int i =0 ;i < Rg.size();i++) - alf.push_back(t1[i] * t2[i] * t3[i]); - for(unsigned int i =0 ;i < Rg.size();i++) + alf.resize(Rg.size()); + for(size_t i =0 ;i < Rg.size();i++) + alf[i] = (t1[i] * t2[i] * t3[i]); + + for(size_t i =0 ;i < Rg.size();i++) alf[i] -= tmp1[i] * tmp2[i] * tmp3[i]; double sum =0.0; @@ -300,7 +296,7 @@ void Decolor::weak_order(Mat img, vector &alf) } void Decolor::grad_system(Mat img, vector < vector < double > > &polyGrad, - vector < double > &Cg, vector < vector >& comb) + vector < double > &Cg, vector & comb) { int h = img.size().height; int w = img.size().width; @@ -363,19 +359,16 @@ void Decolor::wei_update_matrix(vector < vector > &poly, vector > &comb, vector &wei) +void Decolor::wei_inti(vector &comb, vector &wei) { - vector initRGB; + double initRGB[3] = { .33, .33, .33 }; - initRGB.push_back( .33 ); - initRGB.push_back( .33 ); - initRGB.push_back( .33 ); wei = product(comb,initRGB); - vector sum; + vector sum(comb.size()); for(unsigned int i=0;i > &comb, vector &wei) wei[i] = wei[i] * double(0); } - initRGB.clear(); sum.clear(); } @@ -429,4 +421,4 @@ void Decolor::grayImContruct(vector &wei, Mat img, Mat &Gray) Gray -= minval; Gray /= maxval - minval; -} +} \ No newline at end of file -- GitLab