Skip to content

Commit 21d9c47

Browse files
shimatvpisarev
authored andcommitted
Optimize decolor in photo (opencv#10997)
* optimized cv::decolor by removing vector.push_back * restored CV_INSTRUMENT_REGION() and original indent * fix build warnings in contrast_preserve.hpp * undo refactoring contrast_preserve.cpp/hpp
1 parent 514f419 commit 21d9c47

File tree

2 files changed

+77
-85
lines changed

2 files changed

+77
-85
lines changed

modules/photo/src/contrast_preserve.cpp

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ void cv::decolor(InputArray _src, OutputArray _dst, OutputArray _color_boost)
8282

8383
vector <double> Cg;
8484
vector < vector <double> > polyGrad;
85-
vector < vector < int > > comb;
85+
vector <Vec3i> comb;
8686

8787
vector <double> alf;
8888

@@ -103,20 +103,20 @@ void cv::decolor(InputArray _src, OutputArray _dst, OutputArray _color_boost)
103103
iterCount +=1;
104104
pre_E = E;
105105

106-
vector <double> G_pos;
107-
vector <double> G_neg;
106+
vector <double> G_pos(alf.size());
107+
vector <double> G_neg(alf.size());
108108

109-
vector <double> temp;
110-
vector <double> temp1;
109+
vector <double> temp(polyGrad[0].size());
110+
vector <double> temp1(polyGrad[0].size());
111111

112112
double val = 0.0;
113113
for(unsigned int i=0;i< polyGrad[0].size();i++)
114114
{
115115
val = 0.0;
116116
for(unsigned int j =0;j<polyGrad.size();j++)
117117
val = val + (polyGrad[j][i] * wei[j]);
118-
temp.push_back(val - Cg[i]);
119-
temp1.push_back(val + Cg[i]);
118+
temp[i] = val - Cg[i];
119+
temp1[i] = val + Cg[i];
120120
}
121121

122122
double pos = 0.0;
@@ -125,31 +125,31 @@ void cv::decolor(InputArray _src, OutputArray _dst, OutputArray _color_boost)
125125
{
126126
pos = ((1 + alf[i])/2) * exp((-1.0 * 0.5 * pow(temp[i],2))/pow(obj.sigma,2));
127127
neg = ((1 - alf[i])/2) * exp((-1.0 * 0.5 * pow(temp1[i],2))/pow(obj.sigma,2));
128-
G_pos.push_back(pos);
129-
G_neg.push_back(neg);
128+
G_pos[i] = pos;
129+
G_neg[i] = neg;
130130
}
131131

132-
vector <double> EXPsum;
133-
vector <double> EXPterm;
132+
vector <double> EXPsum(G_pos.size());
133+
vector <double> EXPterm(G_pos.size());
134134

135135
for(unsigned int i = 0;i<G_pos.size();i++)
136-
EXPsum.push_back(G_pos[i]+G_neg[i]);
136+
EXPsum[i] = G_pos[i]+G_neg[i];
137137

138-
vector <double> temp2;
138+
vector <double> temp2(EXPsum.size());
139139

140140
for(unsigned int i=0;i<EXPsum.size();i++)
141141
{
142142
if(EXPsum[i] == 0)
143-
temp2.push_back(1.0);
143+
temp2[i] = 1.0;
144144
else
145-
temp2.push_back(0.0);
145+
temp2[i] = 0.0;
146146
}
147147

148148
for(unsigned int i =0; i < G_pos.size();i++)
149-
EXPterm.push_back((G_pos[i] - G_neg[i])/(EXPsum[i] + temp2[i]));
149+
EXPterm[i] = ((G_pos[i] - G_neg[i])/(EXPsum[i] + temp2[i]));
150150

151151
double val1 = 0.0;
152-
vector <double> wei1;
152+
vector <double> wei1(polyGrad.size());
153153

154154
for(unsigned int i=0;i< polyGrad.size();i++)
155155
{
@@ -158,7 +158,7 @@ void cv::decolor(InputArray _src, OutputArray _dst, OutputArray _color_boost)
158158
{
159159
val1 = val1 + (Mt.at<float>(i,j) * EXPterm[j]);
160160
}
161-
wei1.push_back(val1);
161+
wei1[i] = val1;
162162
}
163163

164164
for(unsigned int i =0;i<wei.size();i++)

modules/photo/src/contrast_preserve.hpp

Lines changed: 59 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -58,19 +58,19 @@ class Decolor
5858
public:
5959
float sigma;
6060
void init();
61-
vector<double> product(vector < vector<int> > &comb, vector <double> &initRGB);
61+
vector<double> product(vector <Vec3i> &comb, const double initRGB[3]);
6262
double energyCalcu(vector <double> &Cg, vector < vector <double> > &polyGrad, vector <double> &wei);
6363
void singleChannelGradx(const Mat &img, Mat& dest);
6464
void singleChannelGrady(const Mat &img, Mat& dest);
6565
void gradvector(const Mat &img, vector <double> &grad);
6666
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);
6868
void add_to_vector_poly(vector < vector <double> > &polyGrad, vector <double> &curGrad, int &idx1);
6969
void weak_order(Mat img, vector <double> &alf);
7070
void grad_system(Mat img, vector < vector < double > > &polyGrad,
71-
vector < double > &Cg, vector < vector <int> >& comb);
71+
vector < double > &Cg, vector <Vec3i>& comb);
7272
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);
7474
void grayImContruct(vector <double> &wei, Mat img, Mat &Gray);
7575
};
7676

@@ -83,25 +83,26 @@ int round_num(double a)
8383

8484
double Decolor::energyCalcu(vector <double> &Cg, vector < vector <double> > &polyGrad, vector <double> &wei)
8585
{
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);
8990

9091
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++)
9293
{
9394
val = 0.0;
94-
for(unsigned int j =0;j<polyGrad.size();j++)
95+
for(size_t j =0;j<polyGrad.size();j++)
9596
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];
9899
}
99100

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));
102103

103104
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++)
105106
sum +=energy[i];
106107

107108
return (sum/polyGrad[0].size());
@@ -120,16 +121,16 @@ void Decolor::init()
120121
sigma = 0.02f;
121122
}
122123

123-
vector<double> Decolor::product(vector < vector<int> > &comb, vector <double> &initRGB)
124+
vector<double> Decolor::product(vector <Vec3i> &comb, const double initRGB[3])
124125
{
125-
vector <double> res;
126+
vector <double> res(comb.size());
126127
double dp;
127-
for (unsigned int i=0;i<comb.size();i++)
128+
for (size_t i=0;i<comb.size();i++)
128129
{
129130
dp = 0.0;
130131
for(int j=0;j<3;j++)
131132
dp = dp + (comb[i][j] * initRGB[j]);
132-
res.push_back(dp);
133+
res[i] = dp;
133134
}
134135
return res;
135136
}
@@ -156,8 +157,8 @@ void Decolor::singleChannelGrady(const Mat &img, Mat& dest)
156157

157158
void Decolor::gradvector(const Mat &img, vector <double> &grad)
158159
{
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;
161162
singleChannelGradx(img,dest);
162163
singleChannelGrady(img,dest1);
163164

@@ -167,21 +168,22 @@ void Decolor::gradvector(const Mat &img, vector <double> &grad)
167168
int height = d_trans.size().height;
168169
int width = d_trans.size().width;
169170

171+
grad.resize(width * height * 2);
172+
170173
for(int i=0;i<height;i++)
171174
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);
173176

177+
const int offset = width * height;
174178
for(int i=0;i<height;i++)
175179
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);
179181
}
180182

181183
void Decolor::colorGrad(Mat img, vector <double> &Cg)
182184
{
183185

184-
Mat lab = Mat(img.size(),CV_32FC3);
186+
Mat lab;
185187

186188
cvtColor(img,lab,COLOR_BGR2Lab);
187189

@@ -196,32 +198,24 @@ void Decolor::colorGrad(Mat img, vector <double> &Cg)
196198
gradvector(lab_channel[1],Ima);
197199
gradvector(lab_channel[2],Imb);
198200

201+
Cg.resize(ImL.size());
199202
double res =0.0;
200-
for(unsigned int i=0;i<ImL.size();i++)
203+
for(size_t i=0;i<ImL.size();i++)
201204
{
202205
res=sqrt(pow(ImL[i],2) + pow(Ima[i],2) + pow(Imb[i],2))/100;
203-
Cg.push_back(res);
206+
Cg[i] = res;
204207
}
205-
206-
ImL.clear();
207-
Ima.clear();
208-
Imb.clear();
209208
}
210209

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)
212211
{
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));
217213
idx++;
218214
}
219215

220216
void Decolor::add_to_vector_poly(vector < vector <double> > &polyGrad, vector <double> &curGrad, int &idx1)
221217
{
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);
225219
idx1++;
226220
}
227221

@@ -241,51 +235,53 @@ void Decolor::weak_order(Mat img, vector <double> &alf)
241235
split(img,rgb_channel);
242236

243237
vector <double> Rg, Gg, Bg;
244-
vector <double> t1, t2, t3;
245-
vector <double> tmp1, tmp2, tmp3;
246-
247238
gradvector(rgb_channel[2],Rg);
248239
gradvector(rgb_channel[1],Gg);
249240
gradvector(rgb_channel[0],Bg);
250241

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+
251245
double level = .05;
252246

253247
for(unsigned int i=0;i<Rg.size();i++)
254248
{
255249
if(Rg[i] > level)
256-
t1.push_back(1.0);
250+
t1[i] = 1.0;
257251
else
258-
t1.push_back(0.0);
252+
t1[i] = 0.0;
259253

260254
if(Gg[i] > level)
261-
t2.push_back(1.0);
255+
t2[i] = 1.0;
262256
else
263-
t2.push_back(0.0);
257+
t2[i] = 0.0;
264258

265259
if(Bg[i] > level)
266-
t3.push_back(1.0);
260+
t3[i] = 1.0;
267261
else
268-
t3.push_back(0.0);
262+
t3[i] = 0.0;
269263

270264
if(Rg[i] < -1.0*level)
271-
tmp1.push_back(1.0);
265+
tmp1[i] = 1.0;
272266
else
273-
tmp1.push_back(0.0);
267+
tmp1[i] = 0.0;
274268

275269
if(Gg[i] < -1.0*level)
276-
tmp2.push_back(1.0);
270+
tmp2[i] = 1.0;
277271
else
278-
tmp2.push_back(0.0);
272+
tmp2[i] = 0.0;
279273

280274
if(Bg[i] < -1.0*level)
281-
tmp3.push_back(1.0);
275+
tmp3[i] = 1.0;
282276
else
283-
tmp3.push_back(0.0);
277+
tmp3[i] = 0.0;
284278
}
285-
for(unsigned int i =0 ;i < Rg.size();i++)
286-
alf.push_back(t1[i] * t2[i] * t3[i]);
287279

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++)
289285
alf[i] -= tmp1[i] * tmp2[i] * tmp3[i];
290286

291287
double sum =0.0;
@@ -300,7 +296,7 @@ void Decolor::weak_order(Mat img, vector <double> &alf)
300296
}
301297

302298
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)
304300
{
305301
int h = img.size().height;
306302
int w = img.size().width;
@@ -363,19 +359,16 @@ void Decolor::wei_update_matrix(vector < vector <double> > &poly, vector <double
363359

364360
}
365361

366-
void Decolor::wei_inti(vector < vector <int> > &comb, vector <double> &wei)
362+
void Decolor::wei_inti(vector <Vec3i> &comb, vector <double> &wei)
367363
{
368-
vector <double> initRGB;
364+
double initRGB[3] = { .33, .33, .33 };
369365

370-
initRGB.push_back( .33 );
371-
initRGB.push_back( .33 );
372-
initRGB.push_back( .33 );
373366
wei = product(comb,initRGB);
374367

375-
vector <int> sum;
368+
vector <int> sum(comb.size());
376369

377370
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]);
379372

380373
for(unsigned int i=0;i<sum.size();i++)
381374
{
@@ -385,7 +378,6 @@ void Decolor::wei_inti(vector < vector <int> > &comb, vector <double> &wei)
385378
wei[i] = wei[i] * double(0);
386379
}
387380

388-
initRGB.clear();
389381
sum.clear();
390382

391383
}
@@ -429,4 +421,4 @@ void Decolor::grayImContruct(vector <double> &wei, Mat img, Mat &Gray)
429421

430422
Gray -= minval;
431423
Gray /= maxval - minval;
432-
}
424+
}

0 commit comments

Comments
 (0)