diff --git a/modules/imgproc/src/color.cpp b/modules/imgproc/src/color.cpp index 4f1d6636ed9f479739b0a6f4b3e43e6b51eb66b6..4a382644b64b9bf610a03d8ccee25df2c65197f0 100644 --- a/modules/imgproc/src/color.cpp +++ b/modules/imgproc/src/color.cpp @@ -5856,7 +5856,7 @@ static int16_t *RGB2LabLUT_s16; static int16_t trilinearLUT[TRILINEAR_BASE*TRILINEAR_BASE*TRILINEAR_BASE*8]; static ushort LabToYF_b[256*2]; static const int minABvalue = -8145; -static int *abToXZ_b; +static const int *abToXZ_b; // Luv constants static const bool enableRGB2LuvInterpolation = true; static const bool enablePackedRGB2Luv = true; @@ -5903,9 +5903,9 @@ static LUVLUT_T initLUTforLUV(int BASE, const softfloat &un, const softfloat &vn { const softfloat oneof4 = softfloat::one()/softfloat(4); const softfloat f255(255); - int *LuToUp_b = new int[256*256]; - int *LvToVp_b = new int[256*256]; - long long int *LvToVpl_b = new long long int[256*256]; + int *LuToUp_b = cv::allocSingleton(256*256); + int *LvToVp_b = cv::allocSingleton(256*256); + long long int *LvToVpl_b = cv::allocSingleton(256*256); for(int LL = 0; LL < 256; LL++) { softfloat L = softfloat(LL*100)/f255; @@ -5934,6 +5934,29 @@ static LUVLUT_T initLUTforLUV(int BASE, const softfloat &un, const softfloat &vn return res; } +static int * initLUTforABXZ(int BASE) +{ + int * res = cv::allocSingleton(LAB_BASE*9/4); + for(int i = minABvalue; i < LAB_BASE*9/4+minABvalue; i++) + { + int v; + //6.f/29.f*BASE = 3389.730 + if(i <= 3390) + { + //fxz[k] = (fxz[k] - 16.0f / 116.0f) / 7.787f; + // 7.787f = (29/3)^3/(29*4) + v = i*108/841 - BASE*16/116*108/841; + } + else + { + //fxz[k] = fxz[k] * fxz[k] * fxz[k]; + v = i*i/BASE*i/BASE; + } + res[i-minABvalue] = v; // -1335 <= v <= 88231 + } + return res; +} + static void initLabTabs() { static bool initialized = false; @@ -6017,24 +6040,7 @@ static void initLabTabs() } //Lookup table for a,b to x,z conversion - abToXZ_b = new int[LAB_BASE*9/4]; - for(i = minABvalue; i < LAB_BASE*9/4+minABvalue; i++) - { - int v; - //6.f/29.f*BASE = 3389.730 - if(i <= 3390) - { - //fxz[k] = (fxz[k] - 16.0f / 116.0f) / 7.787f; - // 7.787f = (29/3)^3/(29*4) - v = i*108/841 - BASE*16/116*108/841; - } - else - { - //fxz[k] = fxz[k] * fxz[k] * fxz[k]; - v = i*i/BASE*i/BASE; - } - abToXZ_b[i-minABvalue] = v; // -1335 <= v <= 88231 - } + abToXZ_b = initLUTforABXZ(BASE); softfloat dd = D65[0] + D65[1]*softdouble(15) + D65[2]*softdouble(3); dd = softfloat::one()/max(dd, softfloat::eps());