diff --git a/modules/photo/src/contrast_preserve.hpp b/modules/photo/src/contrast_preserve.hpp index 4079272e99..3fb98e2093 100644 --- a/modules/photo/src/contrast_preserve.hpp +++ b/modules/photo/src/contrast_preserve.hpp @@ -113,14 +113,16 @@ Decolor::Decolor() sigma = 0.02f; } -vector Decolor::product(const vector &comb, const double initRGB[3]) +vector Decolor::product(const vector &comb, const double initRGB[3]) { vector res(comb.size()); for (size_t i=0;i &grad) const singleChannelGradx(img,dest); singleChannelGrady(img,dest1); - Mat d_trans=dest.t(); - Mat d1_trans=dest1.t(); - - const int height = d_trans.size().height; - const int width = d_trans.size().width; + // the function uses transposed dest and dest1 here and bellow + const int height = dest.size().width; + const int width = dest.size().height; grad.resize(width * height * 2); for(int i=0;i(i, j); + grad[i*width + j] = dest.at(j, i); const int offset = width * height; for(int i=0;i(i, j); + grad[offset + i * width + j] = dest1.at(j, i); } void Decolor::colorGrad(const Mat &img, vector &Cg) const @@ -277,7 +277,9 @@ void Decolor::grad_system(const Mat &im, vector < vector < double > > &polyGrad, int idx = 0, idx1 = 0; for(int r=0 ;r <=order; r++) + { for(int g=0; g<=order;g++) + { for(int b =0; b <=order;b++) { if((r+g+b)<=order && (r+g+b) > 0) @@ -293,6 +295,8 @@ void Decolor::grad_system(const Mat &im, vector < vector < double > > &polyGrad, add_to_vector_poly(polyGrad,curGrad,idx1); } } + } + } } void Decolor::wei_update_matrix(const vector < vector > &poly, const vector &Cg, Mat &X) @@ -305,7 +309,6 @@ void Decolor::wei_update_matrix(const vector < vector > &poly, const ve for (int j = 0; j < size0;j++) P.at(i,j) = static_cast(poly[i][j]); - const Mat P_trans = P.t(); Mat B = Mat(size, size0, CV_32FC1); for(int i =0;i < size;i++) { @@ -313,7 +316,8 @@ void Decolor::wei_update_matrix(const vector < vector > &poly, const ve B.at(i,j) = static_cast(poly[i][j] * Cg[j]); } - Mat A = P*P_trans; + Mat A; + mulTransposed(P, A, false); solve(A, B, X, DECOMP_NORMAL); } @@ -352,8 +356,11 @@ void Decolor::grayImContruct(vector &wei, const Mat &img, Mat &Gray) co int kk =0; for(int r =0;r<=order;r++) + { for(int g=0;g<=order;g++) + { for(int b=0;b<=order;b++) + { if((r + g + b) <=order && (r+g+b) > 0) { for(int i = 0;i &wei, const Mat &img, Mat &Gray) co kk=kk+1; } + } + } + } double minval, maxval; minMaxLoc(Gray, &minval, &maxval);