Skip to content

Commit b3018ba

Browse files
committed
LUV tables
1 parent e75056a commit b3018ba

File tree

1 file changed

+51
-37
lines changed

1 file changed

+51
-37
lines changed

modules/imgproc/src/color.cpp

Lines changed: 51 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -5864,9 +5864,12 @@ static const bool enablePackedLuv2RGB = true;
58645864
static int16_t *RGB2LuvLUT_s16;
58655865
static const softfloat uLow(-134), uHigh(220), uRange(uHigh-uLow);
58665866
static const softfloat vLow(-140), vHigh(122), vRange(vHigh-vLow);
5867-
static int *LuToUp_b;
5868-
static int *LvToVp_b;
5869-
static long long int *LvToVpl_b;
5867+
5868+
static struct LUVLUT_T {
5869+
const int *LuToUp_b;
5870+
const int *LvToVp_b;
5871+
const long long int *LvToVpl_b;
5872+
} LUVLUT;
58705873

58715874
#define clip(value) \
58725875
value < 0.0f ? 0.0f : value > 1.0f ? 1.0f : value;
@@ -5896,6 +5899,41 @@ static inline softfloat applyInvGamma(softfloat x)
58965899
pow(xd, softdouble::one()/gammaPower)*(softdouble::one()+gammaXshift) - gammaXshift);
58975900
}
58985901

5902+
static LUVLUT_T initLUTforLUV(int BASE, const softfloat &un, const softfloat &vn)
5903+
{
5904+
const softfloat oneof4 = softfloat::one()/softfloat(4);
5905+
const softfloat f255(255);
5906+
int *LuToUp_b = new int[256*256];
5907+
int *LvToVp_b = new int[256*256];
5908+
long long int *LvToVpl_b = new long long int[256*256];
5909+
for(int LL = 0; LL < 256; LL++)
5910+
{
5911+
softfloat L = softfloat(LL*100)/f255;
5912+
for(int uu = 0; uu < 256; uu++)
5913+
{
5914+
softfloat u = softfloat(uu)*uRange/f255 + uLow;
5915+
softfloat up = softfloat(9)*(u + L*un);
5916+
LuToUp_b[LL*256+uu] = cvRound(up*softfloat(BASE/1024));//1024 is OK, 2048 gave maxerr 3
5917+
}
5918+
for(int vv = 0; vv < 256; vv++)
5919+
{
5920+
softfloat v = softfloat(vv)*vRange/f255 + vLow;
5921+
softfloat vp = oneof4/(v + L*vn);
5922+
if(vp > oneof4) vp = oneof4;
5923+
if(vp < -oneof4) vp = -oneof4;
5924+
int ivp = cvRound(vp*softfloat(BASE*1024));
5925+
LvToVp_b[LL*256+vv] = ivp;
5926+
int vpl = ivp*LL;
5927+
LvToVpl_b[LL*256+vv] = (12*13*100*(BASE/1024))*(long long)vpl;
5928+
}
5929+
}
5930+
LUVLUT_T res;
5931+
res.LuToUp_b = LuToUp_b;
5932+
res.LvToVp_b = LvToVp_b;
5933+
res.LvToVpl_b = LvToVpl_b;
5934+
return res;
5935+
}
5936+
58995937
static void initLabTabs()
59005938
{
59015939
static bool initialized = false;
@@ -6002,7 +6040,6 @@ static void initLabTabs()
60026040
dd = softfloat::one()/max(dd, softfloat::eps());
60036041
softfloat un = dd*softfloat(13*4)*D65[0];
60046042
softfloat vn = dd*softfloat(13*9)*D65[1];
6005-
softfloat oneof4 = softfloat::one()/softfloat(4);
60066043

60076044
//when XYZ are limited to [0, 2]
60086045
/*
@@ -6013,30 +6050,7 @@ static void initLabTabs()
60136050
*/
60146051

60156052
//Luv LUT
6016-
LuToUp_b = new int[256*256];
6017-
LvToVp_b = new int[256*256];
6018-
LvToVpl_b = new long long int[256*256];
6019-
for(int LL = 0; LL < 256; LL++)
6020-
{
6021-
softfloat L = softfloat(LL*100)/f255;
6022-
for(int uu = 0; uu < 256; uu++)
6023-
{
6024-
softfloat u = softfloat(uu)*uRange/f255 + uLow;
6025-
softfloat up = softfloat(9)*(u + L*un);
6026-
LuToUp_b[LL*256+uu] = cvRound(up*softfloat(BASE/1024));//1024 is OK, 2048 gave maxerr 3
6027-
}
6028-
for(int vv = 0; vv < 256; vv++)
6029-
{
6030-
softfloat v = softfloat(vv)*vRange/f255 + vLow;
6031-
softfloat vp = oneof4/(v + L*vn);
6032-
if(vp > oneof4) vp = oneof4;
6033-
if(vp < -oneof4) vp = -oneof4;
6034-
int ivp = cvRound(vp*softfloat(BASE*1024));
6035-
LvToVp_b[LL*256+vv] = ivp;
6036-
int vpl = ivp*LL;
6037-
LvToVpl_b[LL*256+vv] = (12*13*100*(BASE/1024))*(long long)vpl;
6038-
}
6039-
}
6053+
LUVLUT = initLUTforLUV(BASE, un, vn);
60406054

60416055
//try to suppress warning
60426056
static const bool calcLUT = enableRGB2LabInterpolation || enableRGB2LuvInterpolation;
@@ -8411,16 +8425,16 @@ struct Luv2RGBinteger
84118425
// y : [0, BASE]
84128426
// up: [-402, 1431.57]*(BASE/1024)
84138427
// vp: +/- 0.25*BASE*1024
8414-
int up = LuToUp_b[LL*256+uu];
8415-
int vp = LvToVp_b[LL*256+vv];
8428+
int up = LUVLUT.LuToUp_b[LL*256+uu];
8429+
int vp = LUVLUT.LvToVp_b[LL*256+vv];
84168430
//X = y*3.f* up/((float)BASE/1024) *vp/((float)BASE*1024);
84178431
//Z = y*(((12.f*13.f)*((float)LL)*100.f/255.f - up/((float)BASE))*vp/((float)BASE*1024) - 5.f);
84188432

84198433
long long int xv = ((int)up)*(long long)vp;
84208434
int x = (int)(xv/BASE);
84218435
x = y*x/BASE;
84228436

8423-
long long int vpl = LvToVpl_b[LL*256+vv];
8437+
long long int vpl = LUVLUT.LvToVpl_b[LL*256+vv];
84248438
long long int zp = vpl - xv*(255/3);
84258439
zp /= BASE;
84268440
long long int zq = zp - (long long)(5*255*BASE);
@@ -8460,11 +8474,11 @@ struct Luv2RGBinteger
84608474
int v = vvstore[i];
84618475
int y = LabToYF_b[LL*2];
84628476

8463-
int up = LuToUp_b[LL*256+u];
8464-
int vp = LvToVp_b[LL*256+v];
8477+
int up = LUVLUT.LuToUp_b[LL*256+u];
8478+
int vp = LUVLUT.LvToVp_b[LL*256+v];
84658479

84668480
long long int xv = up*(long long int)vp;
8467-
long long int vpl = LvToVpl_b[LL*256+v];
8481+
long long int vpl = LUVLUT.LvToVpl_b[LL*256+v];
84688482
long long int zp = vpl - xv*(255/3);
84698483
zp = zp >> base_shift;
84708484
long long int zq = zp - (5*255*BASE);
@@ -9828,9 +9842,9 @@ static bool ocl_cvtColor( InputArray _src, OutputArray _dst, int code, int dcn )
98289842
static UMat usRGBGammaTab, ucoeffs, uLabCbrtTab;
98299843

98309844
if (srgb && usRGBGammaTab.empty())
9831-
Mat(1, GAMMA_TAB_SIZE * 4, CV_32FC1, sRGBGammaTab).copyTo(usRGBGammaTab);
9845+
Mat(1, GAMMA_TAB_SIZE * 4, CV_32FC1, const_cast<float*>(sRGBGammaTab)).copyTo(usRGBGammaTab);
98329846
if (!lab && uLabCbrtTab.empty())
9833-
Mat(1, LAB_CBRT_TAB_SIZE * 4, CV_32FC1, LabCbrtTab).copyTo(uLabCbrtTab);
9847+
Mat(1, LAB_CBRT_TAB_SIZE * 4, CV_32FC1, const_cast<float*>(LabCbrtTab)).copyTo(uLabCbrtTab);
98349848

98359849
{
98369850
float coeffs[9];
@@ -9916,7 +9930,7 @@ static bool ocl_cvtColor( InputArray _src, OutputArray _dst, int code, int dcn )
99169930
static UMat ucoeffs, usRGBInvGammaTab;
99179931

99189932
if (srgb && usRGBInvGammaTab.empty())
9919-
Mat(1, GAMMA_TAB_SIZE*4, CV_32FC1, sRGBInvGammaTab).copyTo(usRGBInvGammaTab);
9933+
Mat(1, GAMMA_TAB_SIZE*4, CV_32FC1, const_cast<float*>(sRGBInvGammaTab)).copyTo(usRGBInvGammaTab);
99209934

99219935
{
99229936
float coeffs[9];

0 commit comments

Comments
 (0)