From daa9694cab2299d0168505d7f781497f9978059f Mon Sep 17 00:00:00 2001 From: siddharth Date: Mon, 7 Oct 2013 19:30:13 +0530 Subject: [PATCH] Changes done in decolorization module --- modules/photo/src/contrast_preserve.cpp | 46 ++---- modules/photo/src/contrast_preserve.hpp | 190 +++++++----------------- 2 files changed, 61 insertions(+), 175 deletions(-) diff --git a/modules/photo/src/contrast_preserve.cpp b/modules/photo/src/contrast_preserve.cpp index 56912199ea..c60e7184b9 100644 --- a/modules/photo/src/contrast_preserve.cpp +++ b/modules/photo/src/contrast_preserve.cpp @@ -51,13 +51,6 @@ using namespace std; using namespace cv; -double norm_m(double); - -double norm_m(double E) -{ - return sqrt(pow(E,2)); -} - void cv::decolor(InputArray _src, OutputArray _dst, OutputArray _color_boost) { Mat I = _src.getMat(); @@ -78,6 +71,7 @@ void cv::decolor(InputArray _src, OutputArray _dst, OutputArray _color_boost) return; } + // Parameter Setting int maxIter = 15; int iterCount = 0; double tol = .0001; @@ -91,11 +85,11 @@ void cv::decolor(InputArray _src, OutputArray _dst, OutputArray _color_boost) img = Mat(I.size(),CV_32FC3); I.convertTo(img,CV_32FC3,1.0/255.0); + // Initialization obj.init(); vector Cg; vector < vector > polyGrad; - vector < vector > bc; vector < vector < int > > comb; vector alf; @@ -103,6 +97,7 @@ void cv::decolor(InputArray _src, OutputArray _dst, OutputArray _color_boost) obj.grad_system(img,polyGrad,Cg,comb); obj.weak_order(img,alf); + // Solver Mat Mt = Mat(polyGrad.size(),polyGrad[0].size(), CV_32FC1); obj.wei_update_matrix(polyGrad,Cg,Mt); @@ -111,7 +106,7 @@ void cv::decolor(InputArray _src, OutputArray _dst, OutputArray _color_boost) //////////////////////////////// main loop starting //////////////////////////////////////// - while(norm_m(E-pre_E) > tol) + while(sqrt(pow(E-pre_E,2)) > tol) { iterCount +=1; pre_E = E; @@ -136,8 +131,8 @@ void cv::decolor(InputArray _src, OutputArray _dst, OutputArray _color_boost) double ans1 = 0.0; for(unsigned int i =0;i lab_channel; + split(lab,lab_channel); - for(int i =0;i(i,j) = lab.at(i,j*3+0); - a.at(i,j) = lab.at(i,j*3+1); - b.at(i,j) = lab.at(i,j*3+2); - } + dst.copyTo(lab_channel[0]); - for(int i =0;i(i,j) = dst.at(i,j); - } - - for(int i =0;i(i,j*3+0) = l.at(i,j); - lab.at(i,j*3+1) = a.at(i,j); - lab.at(i,j*3+2) = b.at(i,j); - } + merge(lab_channel,lab); cvtColor(lab,color_boost,COLOR_Lab2BGR); } diff --git a/modules/photo/src/contrast_preserve.hpp b/modules/photo/src/contrast_preserve.hpp index 87e33a38c9..6319d15513 100644 --- a/modules/photo/src/contrast_preserve.hpp +++ b/modules/photo/src/contrast_preserve.hpp @@ -51,11 +51,12 @@ using namespace cv; class Decolor { private: - Mat kernel; - Mat kernel1; + Mat kernelx; + Mat kernely; int order; public: + float sigma; void init(); vector product(vector < vector > &comb, vector &initRGB); double energyCalcu(vector &Cg, vector < vector > &polyGrad, vector &wei); @@ -73,18 +74,9 @@ class Decolor void grayImContruct(vector &wei, Mat img, Mat &Gray); }; -int rounding(double a); - -int rounding(double a) -{ - return int(a + 0.5); -} - -float sigma = .02; - double Decolor::energyCalcu(vector &Cg, vector < vector > &polyGrad, vector &wei) { - vector P; + vector energy; vector temp; vector temp1; @@ -99,11 +91,11 @@ double Decolor::energyCalcu(vector &Cg, vector < vector > &pol } for(unsigned int i=0;i &Cg, vector < vector > &pol void Decolor::init() { - kernel = Mat(1,2, CV_32FC1); - kernel1 = Mat(2,1, CV_32FC1); - kernel.at(0,0)=1.0; - kernel.at(0,1)=-1.0; - kernel1.at(0,0)=1.0; - kernel1.at(1,0)=-1.0; + kernelx = Mat(1,2, CV_32FC1); + kernely = Mat(2,1, CV_32FC1); + kernelx.at(0,0)=1.0; + kernelx.at(0,1)=-1.0; + kernely.at(0,0)=1.0; + kernely.at(1,0)=-1.0; order = 2; + sigma = .02; } vector Decolor::product(vector < vector > &comb, vector &initRGB) @@ -138,8 +131,8 @@ void Decolor::singleChannelGradx(const Mat &img, Mat& dest) { int w=img.size().width; int h=img.size().height; - Point anchor(kernel.cols - kernel.cols/2 - 1, kernel.rows - kernel.rows/2 - 1); - filter2D(img, dest, -1, kernel, anchor, 0.0, BORDER_CONSTANT); + Point anchor(kernelx.cols - kernelx.cols/2 - 1, kernelx.rows - kernelx.rows/2 - 1); + filter2D(img, dest, -1, kernelx, anchor, 0.0, BORDER_CONSTANT); for(int i=0;i(i,w-1)=0.0; } @@ -148,8 +141,8 @@ void Decolor::singleChannelGrady(const Mat &img, Mat& dest) { int w=img.size().width; int h=img.size().height; - Point anchor(kernel1.cols - kernel1.cols/2 - 1, kernel1.rows - kernel1.rows/2 - 1); - filter2D(img, dest, -1, kernel1, anchor, 0.0, BORDER_CONSTANT); + Point anchor(kernely.cols - kernely.cols/2 - 1, kernely.rows - kernely.rows/2 - 1); + filter2D(img, dest, -1, kernely, anchor, 0.0, BORDER_CONSTANT); for(int j=0;j(h-1,j)=0.0; } @@ -182,25 +175,19 @@ void Decolor::colorGrad(Mat img, vector &Cg) { Mat lab = Mat(img.size(),CV_32FC3); - Mat l_channel = Mat(img.size(),CV_32FC1); - Mat a_channel = Mat(img.size(),CV_32FC1); - Mat b_channel = Mat(img.size(),CV_32FC1); cvtColor(img,lab,COLOR_BGR2Lab); - for(int i=0;i(i,j) = lab.at(i,j*3+0); - a_channel.at(i,j) = lab.at(i,j*3+1); - b_channel.at(i,j) = lab.at(i,j*3+2); - } + + vector lab_channel; + split(lab,lab_channel); vector ImL; vector Ima; vector Imb; - gradvector(l_channel,ImL); - gradvector(a_channel,Ima); - gradvector(b_channel,Imb); + + gradvector(lab_channel[0],ImL); + gradvector(lab_channel[1],Ima); + gradvector(lab_channel[2],Imb); double res =0.0; for(unsigned int i=0;i &Cg) res=sqrt(pow(ImL[i],2) + pow(Ima[i],2) + pow(Imb[i],2))/100; Cg.push_back(res); } - lab.release(); - l_channel.release(); - a_channel.release(); - b_channel.release(); ImL.clear(); Ima.clear(); @@ -245,37 +228,20 @@ void Decolor::weak_order(Mat img, vector &alf) if((h + w) > 800) { sizefactor = (double)800/(h+w); - resize(img,img,Size(rounding(h*sizefactor),rounding(w*sizefactor))); + resize(img,img,Size(round(h*sizefactor),round(w*sizefactor))); } Mat curIm = Mat(img.size(),CV_32FC1); - Mat red = Mat(img.size(),CV_32FC1); - Mat green = Mat(img.size(),CV_32FC1); - Mat blue = Mat(img.size(),CV_32FC1); + vector rgb_channel; + split(img,rgb_channel); - for(int i=0;i(i,j) = img.at(i,j*3+2); - green.at(i,j) = img.at(i,j*3+1); - blue.at(i,j) = img.at(i,j*3+0); - } + vector Rg, Gg, Bg; + vector t1, t2, t3; + vector tmp1, tmp2, tmp3; - vector Rg; - vector Gg; - vector Bg; - - vector t1; - vector t2; - vector t3; - - vector tmp1; - vector tmp2; - vector tmp3; - - gradvector(red,Rg); - gradvector(green,Gg); - gradvector(blue,Bg); + gradvector(rgb_channel[2],Rg); + gradvector(rgb_channel[1],Gg); + gradvector(rgb_channel[0],Bg); double level = .05; @@ -285,37 +251,27 @@ void Decolor::weak_order(Mat img, vector &alf) t1.push_back(1.0); else t1.push_back(0.0); - } - for(unsigned int i=0;i level) t2.push_back(1.0); else t2.push_back(0.0); - } - for(unsigned int i=0;i level) t3.push_back(1.0); else t3.push_back(0.0); - } - for(unsigned int i=0;i &alf) sum = (double)100*sum/alf.size(); - red.release(); - green.release(); - blue.release(); - curIm.release(); - - Rg.clear(); - Gg.clear(); - Bg.clear(); - - t1.clear(); - t2.clear(); - t3.clear(); - - tmp1.clear(); - tmp2.clear(); - tmp3.clear(); + Rg.clear(); Gg.clear(); Bg.clear(); + t1.clear(); t2.clear(); t3.clear(); + tmp1.clear(); tmp2.clear(); tmp3.clear(); } void Decolor::grad_system(Mat img, vector < vector < double > > &polyGrad, @@ -361,7 +304,7 @@ void Decolor::grad_system(Mat img, vector < vector < double > > &polyGrad, if((h + w) > 800) { sizefactor = (double)800/(h+w); - resize(img,img,Size(rounding(h*sizefactor),rounding(w*sizefactor))); + resize(img,img,Size(round(h*sizefactor),round(w*sizefactor))); } h = img.size().height; @@ -369,17 +312,8 @@ void Decolor::grad_system(Mat img, vector < vector < double > > &polyGrad, colorGrad(img,Cg); Mat curIm = Mat(img.size(),CV_32FC1); - Mat red = Mat(img.size(),CV_32FC1); - Mat green = Mat(img.size(),CV_32FC1); - Mat blue = Mat(img.size(),CV_32FC1); - - for(int i=0;i(i,j) = img.at(i,j*3+2); - green.at(i,j) = img.at(i,j*3+1); - blue.at(i,j) = img.at(i,j*3+0); - } + vector rgb_channel; + split(img,rgb_channel); for(int r=0 ;r <=order; r++) for(int g=0; g<=order;g++) @@ -391,18 +325,13 @@ void Decolor::grad_system(Mat img, vector < vector < double > > &polyGrad, for(int i = 0;i(i,j)= - pow(red.at(i,j),r)*pow(green.at(i,j),g)* - pow(blue.at(i,j),b); + pow(rgb_channel[2].at(i,j),r)*pow(rgb_channel[1].at(i,j),g)* + pow(rgb_channel[0].at(i,j),b); vector curGrad; gradvector(curIm,curGrad); add_to_vector_poly(polyGrad,curGrad); } } - - red.release(); - green.release(); - blue.release(); - curIm.release(); } void Decolor::wei_update_matrix(vector < vector > &poly, vector &Cg, Mat &X) @@ -425,10 +354,6 @@ void Decolor::wei_update_matrix(vector < vector > &poly, vector > &comb, vector &wei) @@ -463,17 +388,8 @@ void Decolor::grayImContruct(vector &wei, Mat img, Mat &Gray) int h=img.size().height; int w=img.size().width; - Mat red = Mat(img.size(),CV_32FC1); - Mat green = Mat(img.size(),CV_32FC1); - Mat blue = Mat(img.size(),CV_32FC1); - - for(int i=0;i(i,j) = img.at(i,j*3+2); - green.at(i,j) = img.at(i,j*3+1); - blue.at(i,j) = img.at(i,j*3+0); - } + vector rgb_channel; + split(img,rgb_channel); int kk =0; @@ -485,8 +401,8 @@ void Decolor::grayImContruct(vector &wei, Mat img, Mat &Gray) for(int i = 0;i(i,j)=Gray.at(i,j) + - (float) wei[kk]*pow(red.at(i,j),r)*pow(green.at(i,j),g)* - pow(blue.at(i,j),b); + (float) wei[kk]*pow(rgb_channel[2].at(i,j),r)*pow(rgb_channel[1].at(i,j),g)* + pow(rgb_channel[0].at(i,j),b); kk=kk+1; } @@ -496,7 +412,7 @@ void Decolor::grayImContruct(vector &wei, Mat img, Mat &Gray) for(int i=0;i(i,j) < minval) minval = Gray.at(i,j); @@ -507,8 +423,4 @@ void Decolor::grayImContruct(vector &wei, Mat img, Mat &Gray) for(int i=0;i(i,j) = (Gray.at(i,j) - minval)/(maxval - minval); - - red.release(); - green.release(); - blue.release(); }