42
42
43
43
#include " precomp.hpp"
44
44
#include " opencv2/photo.hpp"
45
- #include " math.h "
45
+ #include < cmath >
46
46
#include < vector>
47
47
#include < limits>
48
48
#include " contrast_preserve.hpp"
@@ -64,119 +64,93 @@ void cv::decolor(InputArray _src, OutputArray _dst, OutputArray _color_boost)
64
64
CV_Assert (!I.empty () && (I.channels ()==3 ));
65
65
66
66
// Parameter Setting
67
- int maxIter = 15 ;
67
+ const int maxIter = 15 ;
68
+ const double tol = .0001 ;
68
69
int iterCount = 0 ;
69
- double tol = .0001 ;
70
70
double E = 0 ;
71
71
double pre_E = std::numeric_limits<double >::infinity ();
72
72
73
- Decolor obj;
74
-
75
73
Mat img;
76
-
77
- img = Mat (I.size (),CV_32FC3);
78
- I.convertTo (img,CV_32FC3,1.0 /255.0 );
74
+ I.convertTo (img, CV_32FC3, 1.0 /255.0 );
79
75
80
76
// Initialization
81
- obj. init () ;
77
+ Decolor obj;
82
78
83
79
vector <double > Cg;
84
80
vector < vector <double > > polyGrad;
85
81
vector <Vec3i> comb;
86
-
87
82
vector <double > alf;
88
83
89
84
obj.grad_system (img,polyGrad,Cg,comb);
90
85
obj.weak_order (img,alf);
91
86
92
87
// Solver
93
- Mat Mt = Mat (( int ) polyGrad.size (),( int ) polyGrad[0 ].size (), CV_32FC1);
88
+ Mat Mt = Mat (int ( polyGrad.size ()), int ( polyGrad[0 ].size () ), CV_32FC1);
94
89
obj.wei_update_matrix (polyGrad,Cg,Mt);
95
90
96
91
vector <double > wei;
97
92
obj.wei_inti (comb,wei);
98
93
99
94
// ////////////////////////////// main loop starting ////////////////////////////////////////
100
95
96
+ vector <double > G_pos (alf.size ());
97
+ vector <double > G_neg (alf.size ());
98
+ vector <double > EXPsum (G_pos.size ());
99
+ vector <double > EXPterm (G_pos.size ());
100
+ vector <double > temp (polyGrad[0 ].size ());
101
+ vector <double > temp1 (polyGrad[0 ].size ());
102
+ vector <double > temp2 (EXPsum.size ());
103
+ vector <double > wei1 (polyGrad.size ());
104
+
101
105
while (sqrt (pow (E-pre_E,2 )) > tol)
102
106
{
103
107
iterCount +=1 ;
104
108
pre_E = E;
105
109
106
- vector <double > G_pos (alf.size ());
107
- vector <double > G_neg (alf.size ());
108
-
109
- vector <double > temp (polyGrad[0 ].size ());
110
- vector <double > temp1 (polyGrad[0 ].size ());
111
-
112
- double val = 0.0 ;
113
- for (unsigned int i=0 ;i< polyGrad[0 ].size ();i++)
110
+ for (size_t i=0 ; i<polyGrad[0 ].size (); i++)
114
111
{
115
- val = 0.0 ;
116
- for (unsigned int j =0 ;j<polyGrad.size ();j++)
112
+ double val = 0.0 ;
113
+ for (size_t j =0 ; j<polyGrad.size (); j++)
117
114
val = val + (polyGrad[j][i] * wei[j]);
118
115
temp[i] = val - Cg[i];
119
116
temp1[i] = val + Cg[i];
120
117
}
121
118
122
- double pos = 0.0 ;
123
- double neg = 0.0 ;
124
- for (unsigned int i =0 ;i<alf.size ();i++)
119
+ for (size_t i=0 ; i<alf.size (); i++)
125
120
{
126
- pos = ((1 + alf[i])/2 ) * exp ((-1.0 * 0.5 * pow (temp[i],2 ))/pow (obj.sigma ,2 ));
127
- neg = ((1 - alf[i])/2 ) * exp ((-1.0 * 0.5 * pow (temp1[i],2 ))/pow (obj.sigma ,2 ));
121
+ const double sqSigma = obj.sigma * obj.sigma ;
122
+ const double pos = ((1 + alf[i])/2 ) * exp (-1.0 * 0.5 * (temp[i] * temp[i]) / sqSigma);
123
+ const double neg = ((1 - alf[i])/2 ) * exp (-1.0 * 0.5 * (temp1[i] * temp1[i]) / sqSigma);
128
124
G_pos[i] = pos;
129
125
G_neg[i] = neg;
130
126
}
131
127
132
- vector <double > EXPsum (G_pos.size ());
133
- vector <double > EXPterm (G_pos.size ());
134
-
135
- for (unsigned int i = 0 ;i<G_pos.size ();i++)
128
+ for (size_t i=0 ; i<G_pos.size (); i++)
136
129
EXPsum[i] = G_pos[i]+G_neg[i];
137
130
138
- vector <double > temp2 (EXPsum.size ());
139
-
140
- for (unsigned int i=0 ;i<EXPsum.size ();i++)
141
- {
142
- if (EXPsum[i] == 0 )
143
- temp2[i] = 1.0 ;
144
- else
145
- temp2[i] = 0.0 ;
146
- }
131
+ for (size_t i=0 ; i<EXPsum.size (); i++)
132
+ temp2[i] = (EXPsum[i] == 0 ) ? 1.0 : 0.0 ;
147
133
148
- for (unsigned int i =0 ; i < G_pos.size ();i++)
149
- EXPterm[i] = (( G_pos[i] - G_neg[i])/(EXPsum[i] + temp2[i]) );
134
+ for (size_t i =0 ; i< G_pos.size (); i++)
135
+ EXPterm[i] = (G_pos[i] - G_neg[i])/(EXPsum[i] + temp2[i]);
150
136
151
- double val1 = 0.0 ;
152
- vector <double > wei1 (polyGrad.size ());
153
-
154
- for (unsigned int i=0 ;i< polyGrad.size ();i++)
137
+ for (int i=0 ; i<int (polyGrad.size ()); i++)
155
138
{
156
- val1 = 0.0 ;
157
- for (unsigned int j =0 ;j< polyGrad[0 ].size (); j++)
139
+ double val1 = 0.0 ;
140
+ for (int j=0 ; j< int ( polyGrad[0 ].size ()); j++)
158
141
{
159
142
val1 = val1 + (Mt.at <float >(i,j) * EXPterm[j]);
160
143
}
161
144
wei1[i] = val1;
162
145
}
163
146
164
- for (unsigned int i =0 ;i<wei.size ();i++)
147
+ for (size_t i =0 ; i<wei.size (); i++)
165
148
wei[i] = wei1[i];
166
149
167
- E = obj.energyCalcu (Cg,polyGrad,wei);
150
+ E = obj.energyCalcu (Cg, polyGrad, wei);
168
151
169
152
if (iterCount > maxIter)
170
153
break ;
171
-
172
- G_pos.clear ();
173
- G_neg.clear ();
174
- temp.clear ();
175
- temp1.clear ();
176
- EXPsum.clear ();
177
- EXPterm.clear ();
178
- temp2.clear ();
179
- wei1.clear ();
180
154
}
181
155
182
156
Mat Gray = Mat::zeros (img.size (),CV_32FC1);
@@ -186,9 +160,7 @@ void cv::decolor(InputArray _src, OutputArray _dst, OutputArray _color_boost)
186
160
187
161
// ///////////////////////////////// Contrast Boosting /////////////////////////////////
188
162
189
- Mat lab = Mat (img.size (),CV_8UC3);
190
- Mat color = Mat (img.size (),CV_8UC3);
191
-
163
+ Mat lab;
192
164
cvtColor (I,lab,COLOR_BGR2Lab);
193
165
194
166
vector <Mat> lab_channel;
0 commit comments