#include "precomp.hpp" #include "opencv2/photo.hpp" #include "opencv2/imgproc.hpp" #include "math.h" #include #include #include #include "contrast_preserve.hpp" using namespace std; using namespace cv; int rounding(double a); int rounding(double a) { return int(a + 0.5); } void cv::decolor(InputArray _src, OutputArray _dst) { Mat I = _src.getMat(); _dst.create(I.size(), CV_8UC1); Mat dst = _dst.getMat(); if(!I.data ) { cout << "Could not open or find the image" << endl ; return; } if(I.channels() !=3) { cout << "Input Color Image" << endl; return; } float sigma = .02; int maxIter = 8; int iterCount = 0; int h = I.size().height; int w = I.size().width; Decolor obj; Mat img; double sizefactor; if((h + w) > 900) { sizefactor = (double)900/(h+w); resize(I,I,Size(rounding(h*sizefactor),rounding(w*sizefactor))); img = Mat(I.size(),CV_32FC3); I.convertTo(img,CV_32FC3,1.0/255.0); } else { img = Mat(I.size(),CV_32FC3); I.convertTo(img,CV_32FC3,1.0/255.0); } obj.init(); vector Cg; vector < vector > polyGrad; vector < vector > bc; vector < vector < int > > comb; vector alf; obj.grad_system(img,polyGrad,Cg,comb); obj.weak_order(img,alf); Mat Mt = Mat(polyGrad.size(),polyGrad[0].size(), CV_32FC1); obj.wei_update_matrix(polyGrad,Cg,Mt); vector wei; obj.wei_inti(comb,wei); //////////////////////////////// main loop starting //////////////////////////////////////// while (iterCount < maxIter) { iterCount +=1; vector G_pos; vector G_neg; vector temp; vector temp1; double val = 0.0; for(unsigned int i=0;i< polyGrad[0].size();i++) { val = 0.0; for(unsigned int j =0;j EXPsum; vector EXPterm; for(unsigned int i = 0;i temp2; for(unsigned int i=0;i wei1; for(unsigned int i=0;i< polyGrad.size();i++) { val1 = 0.0; for(unsigned int j =0;j(i,j) * EXPterm[j]); } wei1.push_back(val1); } for(unsigned int i =0;i