Commit 5bf7f09a authored by shimat's avatar shimat Committed by Alexander Alekhin

Merge pull request #11035 from shimat:refactoring_decolor

Refactor decolor (#11035)

* decolor: modernize deprecated headers (math.h -> cmath)

* refactor contrast_preserve.cpp

* refactor contrast_preserve.hpp (add static/const)

* refactor contrast_preserve.hpp (join assignment and declaration)

* refactor contrast_preserve.hpp (format)

* refactor test_decolor.cpp (indent)

* refactor contrast_preserve.hpp (const)

* contrast_preserve.hpp : optimize by minMaxLoc

* fix trailing-whitespace

* fix warning C4267 on VC++ x64
(conversion from 'size_t' to 'int', possible loss of data)

* use cvRound instead of round_num

* decrease indentation of test_decolor.cpp

* remove pow() to optimize

* remove redundant Mat initialization
parent 2244f172
...@@ -42,7 +42,7 @@ ...@@ -42,7 +42,7 @@
#include "precomp.hpp" #include "precomp.hpp"
#include "opencv2/photo.hpp" #include "opencv2/photo.hpp"
#include "math.h" #include <cmath>
#include <vector> #include <vector>
#include <limits> #include <limits>
#include "contrast_preserve.hpp" #include "contrast_preserve.hpp"
...@@ -64,33 +64,28 @@ void cv::decolor(InputArray _src, OutputArray _dst, OutputArray _color_boost) ...@@ -64,33 +64,28 @@ void cv::decolor(InputArray _src, OutputArray _dst, OutputArray _color_boost)
CV_Assert(!I.empty() && (I.channels()==3)); CV_Assert(!I.empty() && (I.channels()==3));
// Parameter Setting // Parameter Setting
int maxIter = 15; const int maxIter = 15;
const double tol = .0001;
int iterCount = 0; int iterCount = 0;
double tol = .0001;
double E = 0; double E = 0;
double pre_E = std::numeric_limits<double>::infinity(); double pre_E = std::numeric_limits<double>::infinity();
Decolor obj;
Mat img; Mat img;
I.convertTo(img, CV_32FC3, 1.0/255.0);
img = Mat(I.size(),CV_32FC3);
I.convertTo(img,CV_32FC3,1.0/255.0);
// Initialization // Initialization
obj.init(); Decolor obj;
vector <double> Cg; vector <double> Cg;
vector < vector <double> > polyGrad; vector < vector <double> > polyGrad;
vector <Vec3i> comb; vector <Vec3i> comb;
vector <double> alf; vector <double> alf;
obj.grad_system(img,polyGrad,Cg,comb); obj.grad_system(img,polyGrad,Cg,comb);
obj.weak_order(img,alf); obj.weak_order(img,alf);
// Solver // Solver
Mat Mt = Mat((int)polyGrad.size(),(int)polyGrad[0].size(), CV_32FC1); Mat Mt = Mat(int(polyGrad.size()),int(polyGrad[0].size()), CV_32FC1);
obj.wei_update_matrix(polyGrad,Cg,Mt); obj.wei_update_matrix(polyGrad,Cg,Mt);
vector <double> wei; vector <double> wei;
...@@ -98,85 +93,64 @@ void cv::decolor(InputArray _src, OutputArray _dst, OutputArray _color_boost) ...@@ -98,85 +93,64 @@ void cv::decolor(InputArray _src, OutputArray _dst, OutputArray _color_boost)
//////////////////////////////// main loop starting //////////////////////////////////////// //////////////////////////////// main loop starting ////////////////////////////////////////
while(sqrt(pow(E-pre_E,2)) > tol)
{
iterCount +=1;
pre_E = E;
vector <double> G_pos(alf.size()); vector <double> G_pos(alf.size());
vector <double> G_neg(alf.size()); vector <double> G_neg(alf.size());
vector <double> EXPsum(G_pos.size());
vector <double> EXPterm(G_pos.size());
vector <double> temp(polyGrad[0].size()); vector <double> temp(polyGrad[0].size());
vector <double> temp1(polyGrad[0].size()); vector <double> temp1(polyGrad[0].size());
vector <double> temp2(EXPsum.size());
vector <double> wei1(polyGrad.size());
double val = 0.0; while(sqrt(pow(E-pre_E,2)) > tol)
for(unsigned int i=0;i< polyGrad[0].size();i++)
{ {
val = 0.0; iterCount +=1;
for(unsigned int j =0;j<polyGrad.size();j++) pre_E = E;
for(size_t i=0; i<polyGrad[0].size(); i++)
{
double val = 0.0;
for(size_t j=0; j<polyGrad.size(); j++)
val = val + (polyGrad[j][i] * wei[j]); val = val + (polyGrad[j][i] * wei[j]);
temp[i] = val - Cg[i]; temp[i] = val - Cg[i];
temp1[i] = val + Cg[i]; temp1[i] = val + Cg[i];
} }
double pos = 0.0; for(size_t i=0; i<alf.size(); i++)
double neg = 0.0;
for(unsigned int i =0;i<alf.size();i++)
{ {
pos = ((1 + alf[i])/2) * exp((-1.0 * 0.5 * pow(temp[i],2))/pow(obj.sigma,2)); const double sqSigma = obj.sigma * obj.sigma;
neg = ((1 - alf[i])/2) * exp((-1.0 * 0.5 * pow(temp1[i],2))/pow(obj.sigma,2)); const double pos = ((1 + alf[i])/2) * exp(-1.0 * 0.5 * (temp[i] * temp[i]) / sqSigma);
const double neg = ((1 - alf[i])/2) * exp(-1.0 * 0.5 * (temp1[i] * temp1[i]) / sqSigma);
G_pos[i] = pos; G_pos[i] = pos;
G_neg[i] = neg; G_neg[i] = neg;
} }
vector <double> EXPsum(G_pos.size()); for(size_t i=0; i<G_pos.size(); i++)
vector <double> EXPterm(G_pos.size());
for(unsigned int i = 0;i<G_pos.size();i++)
EXPsum[i] = G_pos[i]+G_neg[i]; EXPsum[i] = G_pos[i]+G_neg[i];
vector <double> temp2(EXPsum.size()); for(size_t i=0; i<EXPsum.size(); i++)
temp2[i] = (EXPsum[i] == 0) ? 1.0 : 0.0;
for(unsigned int i=0;i<EXPsum.size();i++) for(size_t i=0; i<G_pos.size(); i++)
{ EXPterm[i] = (G_pos[i] - G_neg[i])/(EXPsum[i] + temp2[i]);
if(EXPsum[i] == 0)
temp2[i] = 1.0;
else
temp2[i] = 0.0;
}
for(unsigned int i =0; i < G_pos.size();i++)
EXPterm[i] = ((G_pos[i] - G_neg[i])/(EXPsum[i] + temp2[i]));
double val1 = 0.0;
vector <double> wei1(polyGrad.size());
for(unsigned int i=0;i< polyGrad.size();i++) for(int i=0; i<int(polyGrad.size()); i++)
{ {
val1 = 0.0; double val1 = 0.0;
for(unsigned int j =0;j<polyGrad[0].size();j++) for(int j=0; j<int(polyGrad[0].size()); j++)
{ {
val1 = val1 + (Mt.at<float>(i,j) * EXPterm[j]); val1 = val1 + (Mt.at<float>(i,j) * EXPterm[j]);
} }
wei1[i] = val1; wei1[i] = val1;
} }
for(unsigned int i =0;i<wei.size();i++) for(size_t i=0; i<wei.size(); i++)
wei[i] = wei1[i]; wei[i] = wei1[i];
E = obj.energyCalcu(Cg,polyGrad,wei); E = obj.energyCalcu(Cg, polyGrad, wei);
if(iterCount > maxIter) if(iterCount > maxIter)
break; break;
G_pos.clear();
G_neg.clear();
temp.clear();
temp1.clear();
EXPsum.clear();
EXPterm.clear();
temp2.clear();
wei1.clear();
} }
Mat Gray = Mat::zeros(img.size(),CV_32FC1); Mat Gray = Mat::zeros(img.size(),CV_32FC1);
...@@ -186,9 +160,7 @@ void cv::decolor(InputArray _src, OutputArray _dst, OutputArray _color_boost) ...@@ -186,9 +160,7 @@ void cv::decolor(InputArray _src, OutputArray _dst, OutputArray _color_boost)
/////////////////////////////////// Contrast Boosting ///////////////////////////////// /////////////////////////////////// Contrast Boosting /////////////////////////////////
Mat lab = Mat(img.size(),CV_8UC3); Mat lab;
Mat color = Mat(img.size(),CV_8UC3);
cvtColor(I,lab,COLOR_BGR2Lab); cvtColor(I,lab,COLOR_BGR2Lab);
vector <Mat> lab_channel; vector <Mat> lab_channel;
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment