@@ -58,19 +58,19 @@ class Decolor
58
58
public:
59
59
float sigma;
60
60
void init ();
61
- vector<double > product (vector < vector< int > > &comb, vector < double > & initRGB);
61
+ vector<double > product (vector <Vec3i> &comb, const double initRGB[ 3 ] );
62
62
double energyCalcu (vector <double > &Cg, vector < vector <double > > &polyGrad, vector <double > &wei);
63
63
void singleChannelGradx (const Mat &img, Mat& dest);
64
64
void singleChannelGrady (const Mat &img, Mat& dest);
65
65
void gradvector (const Mat &img, vector <double > &grad);
66
66
void colorGrad (Mat img, vector <double > &Cg);
67
- void add_vector (vector < vector < int > > &comb, int &idx, int r,int g,int b);
67
+ void add_vector (vector <Vec3i > &comb, int &idx, int r,int g,int b);
68
68
void add_to_vector_poly (vector < vector <double > > &polyGrad, vector <double > &curGrad, int &idx1);
69
69
void weak_order (Mat img, vector <double > &alf);
70
70
void grad_system (Mat img, vector < vector < double > > &polyGrad,
71
- vector < double > &Cg, vector < vector < int > >& comb);
71
+ vector < double > &Cg, vector <Vec3i >& comb);
72
72
void wei_update_matrix (vector < vector <double > > &poly, vector <double > &Cg, Mat &X);
73
- void wei_inti (vector < vector < int > > &comb, vector <double > &wei);
73
+ void wei_inti (vector <Vec3i > &comb, vector <double > &wei);
74
74
void grayImContruct (vector <double > &wei, Mat img, Mat &Gray);
75
75
};
76
76
@@ -83,25 +83,26 @@ int round_num(double a)
83
83
84
84
double Decolor::energyCalcu (vector <double > &Cg, vector < vector <double > > &polyGrad, vector <double > &wei)
85
85
{
86
- vector <double > energy;
87
- vector <double > temp;
88
- vector <double > temp1;
86
+ const size_t size = polyGrad[0 ].size ();
87
+ vector <double > energy (size);
88
+ vector <double > temp (size);
89
+ vector <double > temp1 (size);
89
90
90
91
double val = 0.0 ;
91
- for (unsigned int i=0 ;i< polyGrad[0 ].size ();i++)
92
+ for (size_t i=0 ;i< polyGrad[0 ].size ();i++)
92
93
{
93
94
val = 0.0 ;
94
- for (unsigned int j =0 ;j<polyGrad.size ();j++)
95
+ for (size_t j =0 ;j<polyGrad.size ();j++)
95
96
val = val + (polyGrad[j][i] * wei[j]);
96
- temp. push_back ( val - Cg[i]) ;
97
- temp1. push_back ( val + Cg[i]) ;
97
+ temp[i] = val - Cg[i];
98
+ temp1[i] = val + Cg[i];
98
99
}
99
100
100
- for (unsigned int i=0 ;i<polyGrad[0 ].size ();i++)
101
- energy. push_back ( -1.0 *log (exp (-1.0 *pow (temp[i],2 )/sigma) + exp (-1.0 *pow (temp1[i],2 )/sigma) ));
101
+ for (size_t i=0 ;i<polyGrad[0 ].size ();i++)
102
+ energy[i] = -1.0 *log (exp (-1.0 *pow (temp[i],2 )/sigma) + exp (-1.0 *pow (temp1[i],2 )/sigma));
102
103
103
104
double sum = 0.0 ;
104
- for (unsigned int i=0 ;i<polyGrad[0 ].size ();i++)
105
+ for (size_t i=0 ;i<polyGrad[0 ].size ();i++)
105
106
sum +=energy[i];
106
107
107
108
return (sum/polyGrad[0 ].size ());
@@ -120,16 +121,16 @@ void Decolor::init()
120
121
sigma = 0 .02f ;
121
122
}
122
123
123
- vector<double > Decolor::product (vector < vector< int > > &comb, vector < double > & initRGB)
124
+ vector<double > Decolor::product (vector <Vec3i> &comb, const double initRGB[ 3 ] )
124
125
{
125
- vector <double > res;
126
+ vector <double > res (comb. size ()) ;
126
127
double dp;
127
- for (unsigned int i=0 ;i<comb.size ();i++)
128
+ for (size_t i=0 ;i<comb.size ();i++)
128
129
{
129
130
dp = 0.0 ;
130
131
for (int j=0 ;j<3 ;j++)
131
132
dp = dp + (comb[i][j] * initRGB[j]);
132
- res. push_back (dp) ;
133
+ res[i] = dp ;
133
134
}
134
135
return res;
135
136
}
@@ -156,8 +157,8 @@ void Decolor::singleChannelGrady(const Mat &img, Mat& dest)
156
157
157
158
void Decolor::gradvector (const Mat &img, vector <double > &grad)
158
159
{
159
- Mat dest= Mat (img. size (). height ,img. size (). width , CV_32FC1) ;
160
- Mat dest1= Mat (img. size (). height ,img. size (). width , CV_32FC1) ;
160
+ Mat dest;
161
+ Mat dest1;
161
162
singleChannelGradx (img,dest);
162
163
singleChannelGrady (img,dest1);
163
164
@@ -167,21 +168,22 @@ void Decolor::gradvector(const Mat &img, vector <double> &grad)
167
168
int height = d_trans.size ().height ;
168
169
int width = d_trans.size ().width ;
169
170
171
+ grad.resize (width * height * 2 );
172
+
170
173
for (int i=0 ;i<height;i++)
171
174
for (int j=0 ;j<width;j++)
172
- grad. push_back ( d_trans.at <float >(i,j) );
175
+ grad[i*height + j] = d_trans.at <float >(i, j );
173
176
177
+ const int offset = width * height;
174
178
for (int i=0 ;i<height;i++)
175
179
for (int j=0 ;j<width;j++)
176
- grad.push_back (d1_trans.at <float >(i,j));
177
- dest.release ();
178
- dest1.release ();
180
+ grad[offset + i * height + j] = d1_trans.at <float >(i, j);
179
181
}
180
182
181
183
void Decolor::colorGrad (Mat img, vector <double > &Cg)
182
184
{
183
185
184
- Mat lab = Mat (img. size (),CV_32FC3) ;
186
+ Mat lab;
185
187
186
188
cvtColor (img,lab,COLOR_BGR2Lab);
187
189
@@ -196,32 +198,24 @@ void Decolor::colorGrad(Mat img, vector <double> &Cg)
196
198
gradvector (lab_channel[1 ],Ima);
197
199
gradvector (lab_channel[2 ],Imb);
198
200
201
+ Cg.resize (ImL.size ());
199
202
double res =0.0 ;
200
- for (unsigned int i=0 ;i<ImL.size ();i++)
203
+ for (size_t i=0 ;i<ImL.size ();i++)
201
204
{
202
205
res=sqrt (pow (ImL[i],2 ) + pow (Ima[i],2 ) + pow (Imb[i],2 ))/100 ;
203
- Cg. push_back ( res) ;
206
+ Cg[i] = res;
204
207
}
205
-
206
- ImL.clear ();
207
- Ima.clear ();
208
- Imb.clear ();
209
208
}
210
209
211
- void Decolor::add_vector (vector < vector < int > > &comb, int &idx, int r,int g,int b)
210
+ void Decolor::add_vector (vector <Vec3i > &comb, int &idx, int r,int g,int b)
212
211
{
213
- comb.push_back ( vector <int >() );
214
- comb.at (idx).push_back ( r );
215
- comb.at (idx).push_back ( g );
216
- comb.at (idx).push_back ( b );
212
+ comb.push_back (Vec3i (r, g, b));
217
213
idx++;
218
214
}
219
215
220
216
void Decolor::add_to_vector_poly (vector < vector <double > > &polyGrad, vector <double > &curGrad, int &idx1)
221
217
{
222
- polyGrad.push_back ( vector <double >() );
223
- for (unsigned int i=0 ;i<curGrad.size ();i++)
224
- polyGrad.at (idx1).push_back (curGrad[i]);
218
+ polyGrad.push_back (curGrad);
225
219
idx1++;
226
220
}
227
221
@@ -241,51 +235,53 @@ void Decolor::weak_order(Mat img, vector <double> &alf)
241
235
split (img,rgb_channel);
242
236
243
237
vector <double > Rg, Gg, Bg;
244
- vector <double > t1, t2, t3;
245
- vector <double > tmp1, tmp2, tmp3;
246
-
247
238
gradvector (rgb_channel[2 ],Rg);
248
239
gradvector (rgb_channel[1 ],Gg);
249
240
gradvector (rgb_channel[0 ],Bg);
250
241
242
+ vector <double > t1 (Rg.size ()), t2 (Rg.size ()), t3 (Rg.size ());
243
+ vector <double > tmp1 (Rg.size ()), tmp2 (Rg.size ()), tmp3 (Rg.size ());
244
+
251
245
double level = .05 ;
252
246
253
247
for (unsigned int i=0 ;i<Rg.size ();i++)
254
248
{
255
249
if (Rg[i] > level)
256
- t1. push_back ( 1.0 ) ;
250
+ t1[i] = 1.0 ;
257
251
else
258
- t1. push_back ( 0.0 ) ;
252
+ t1[i] = 0.0 ;
259
253
260
254
if (Gg[i] > level)
261
- t2. push_back ( 1.0 ) ;
255
+ t2[i] = 1.0 ;
262
256
else
263
- t2. push_back ( 0.0 ) ;
257
+ t2[i] = 0.0 ;
264
258
265
259
if (Bg[i] > level)
266
- t3. push_back ( 1.0 ) ;
260
+ t3[i] = 1.0 ;
267
261
else
268
- t3. push_back ( 0.0 ) ;
262
+ t3[i] = 0.0 ;
269
263
270
264
if (Rg[i] < -1.0 *level)
271
- tmp1. push_back ( 1.0 ) ;
265
+ tmp1[i] = 1.0 ;
272
266
else
273
- tmp1. push_back ( 0.0 ) ;
267
+ tmp1[i] = 0.0 ;
274
268
275
269
if (Gg[i] < -1.0 *level)
276
- tmp2. push_back ( 1.0 ) ;
270
+ tmp2[i] = 1.0 ;
277
271
else
278
- tmp2. push_back ( 0.0 ) ;
272
+ tmp2[i] = 0.0 ;
279
273
280
274
if (Bg[i] < -1.0 *level)
281
- tmp3. push_back ( 1.0 ) ;
275
+ tmp3[i] = 1.0 ;
282
276
else
283
- tmp3. push_back ( 0.0 ) ;
277
+ tmp3[i] = 0.0 ;
284
278
}
285
- for (unsigned int i =0 ;i < Rg.size ();i++)
286
- alf.push_back (t1[i] * t2[i] * t3[i]);
287
279
288
- for (unsigned int i =0 ;i < Rg.size ();i++)
280
+ alf.resize (Rg.size ());
281
+ for (size_t i =0 ;i < Rg.size ();i++)
282
+ alf[i] = (t1[i] * t2[i] * t3[i]);
283
+
284
+ for (size_t i =0 ;i < Rg.size ();i++)
289
285
alf[i] -= tmp1[i] * tmp2[i] * tmp3[i];
290
286
291
287
double sum =0.0 ;
@@ -300,7 +296,7 @@ void Decolor::weak_order(Mat img, vector <double> &alf)
300
296
}
301
297
302
298
void Decolor::grad_system (Mat img, vector < vector < double > > &polyGrad,
303
- vector < double > &Cg, vector < vector < int > >& comb)
299
+ vector < double > &Cg, vector <Vec3i >& comb)
304
300
{
305
301
int h = img.size ().height ;
306
302
int w = img.size ().width ;
@@ -363,19 +359,16 @@ void Decolor::wei_update_matrix(vector < vector <double> > &poly, vector <double
363
359
364
360
}
365
361
366
- void Decolor::wei_inti (vector < vector < int > > &comb, vector <double > &wei)
362
+ void Decolor::wei_inti (vector <Vec3i > &comb, vector <double > &wei)
367
363
{
368
- vector < double > initRGB;
364
+ double initRGB[ 3 ] = { . 33 , . 33 , . 33 } ;
369
365
370
- initRGB.push_back ( .33 );
371
- initRGB.push_back ( .33 );
372
- initRGB.push_back ( .33 );
373
366
wei = product (comb,initRGB);
374
367
375
- vector <int > sum;
368
+ vector <int > sum (comb. size ()) ;
376
369
377
370
for (unsigned int i=0 ;i<comb.size ();i++)
378
- sum. push_back (comb[i][0 ] + comb[i][1 ] + comb[i][2 ]);
371
+ sum[i] = (comb[i][0 ] + comb[i][1 ] + comb[i][2 ]);
379
372
380
373
for (unsigned int i=0 ;i<sum.size ();i++)
381
374
{
@@ -385,7 +378,6 @@ void Decolor::wei_inti(vector < vector <int> > &comb, vector <double> &wei)
385
378
wei[i] = wei[i] * double (0 );
386
379
}
387
380
388
- initRGB.clear ();
389
381
sum.clear ();
390
382
391
383
}
@@ -429,4 +421,4 @@ void Decolor::grayImContruct(vector <double> &wei, Mat img, Mat &Gray)
429
421
430
422
Gray -= minval;
431
423
Gray /= maxval - minval;
432
- }
424
+ }
0 commit comments