@@ -113,14 +113,16 @@ Decolor::Decolor()
113
113
sigma = 0 .02f ;
114
114
}
115
115
116
- vector<double > Decolor::product (const vector <Vec3i> &comb, const double initRGB[3 ])
116
+ vector<double > Decolor::product (const vector<Vec3i> &comb, const double initRGB[3 ])
117
117
{
118
118
vector <double > res (comb.size ());
119
119
for (size_t i=0 ;i<comb.size ();i++)
120
120
{
121
121
double dp = 0.0 ;
122
122
for (int j=0 ;j<3 ;j++)
123
+ {
123
124
dp = dp + (comb[i][j] * initRGB[j]);
125
+ }
124
126
res[i] = dp;
125
127
}
126
128
return res;
@@ -149,22 +151,20 @@ void Decolor::gradvector(const Mat &img, vector <double> &grad) const
149
151
singleChannelGradx (img,dest);
150
152
singleChannelGrady (img,dest1);
151
153
152
- Mat d_trans=dest.t ();
153
- Mat d1_trans=dest1.t ();
154
-
155
- const int height = d_trans.size ().height ;
156
- const int width = d_trans.size ().width ;
154
+ // the function uses transposed dest and dest1 here and bellow
155
+ const int height = dest.size ().width ;
156
+ const int width = dest.size ().height ;
157
157
158
158
grad.resize (width * height * 2 );
159
159
160
160
for (int i=0 ;i<height;i++)
161
161
for (int j=0 ;j<width;j++)
162
- grad[i*width + j] = d_trans .at <float >(i, j );
162
+ grad[i*width + j] = dest .at <float >(j, i );
163
163
164
164
const int offset = width * height;
165
165
for (int i=0 ;i<height;i++)
166
166
for (int j=0 ;j<width;j++)
167
- grad[offset + i * width + j] = d1_trans .at <float >(i, j );
167
+ grad[offset + i * width + j] = dest1 .at <float >(j, i );
168
168
}
169
169
170
170
void Decolor::colorGrad (const Mat &img, vector <double > &Cg) const
@@ -277,7 +277,9 @@ void Decolor::grad_system(const Mat &im, vector < vector < double > > &polyGrad,
277
277
278
278
int idx = 0 , idx1 = 0 ;
279
279
for (int r=0 ;r <=order; r++)
280
+ {
280
281
for (int g=0 ; g<=order;g++)
282
+ {
281
283
for (int b =0 ; b <=order;b++)
282
284
{
283
285
if ((r+g+b)<=order && (r+g+b) > 0 )
@@ -293,6 +295,8 @@ void Decolor::grad_system(const Mat &im, vector < vector < double > > &polyGrad,
293
295
add_to_vector_poly (polyGrad,curGrad,idx1);
294
296
}
295
297
}
298
+ }
299
+ }
296
300
}
297
301
298
302
void Decolor::wei_update_matrix (const vector < vector <double > > &poly, const vector <double > &Cg, Mat &X)
@@ -305,15 +309,15 @@ void Decolor::wei_update_matrix(const vector < vector <double> > &poly, const ve
305
309
for (int j = 0 ; j < size0;j++)
306
310
P.at <float >(i,j) = static_cast <float >(poly[i][j]);
307
311
308
- const Mat P_trans = P.t ();
309
312
Mat B = Mat (size, size0, CV_32FC1);
310
313
for (int i =0 ;i < size;i++)
311
314
{
312
315
for (int j = 0 , end = int (Cg.size ()); j < end;j++)
313
316
B.at <float >(i,j) = static_cast <float >(poly[i][j] * Cg[j]);
314
317
}
315
318
316
- Mat A = P*P_trans;
319
+ Mat A;
320
+ mulTransposed (P, A, false );
317
321
solve (A, B, X, DECOMP_NORMAL);
318
322
319
323
}
@@ -352,8 +356,11 @@ void Decolor::grayImContruct(vector <double> &wei, const Mat &img, Mat &Gray) co
352
356
int kk =0 ;
353
357
354
358
for (int r =0 ;r<=order;r++)
359
+ {
355
360
for (int g=0 ;g<=order;g++)
361
+ {
356
362
for (int b=0 ;b<=order;b++)
363
+ {
357
364
if ((r + g + b) <=order && (r+g+b) > 0 )
358
365
{
359
366
for (int i = 0 ;i<h;i++)
@@ -364,6 +371,9 @@ void Decolor::grayImContruct(vector <double> &wei, const Mat &img, Mat &Gray) co
364
371
365
372
kk=kk+1 ;
366
373
}
374
+ }
375
+ }
376
+ }
367
377
368
378
double minval, maxval;
369
379
minMaxLoc (Gray, &minval, &maxval);
0 commit comments