📄 mycolorspace.cpp
字号:
my_y = (float) ( Yn * pow((v + 16.0) / 116.0, 3) );
float u_prime = u / (13 * v) + Un_prime;
float v_prime = l / (13 * v) + Vn_prime;
my_x = 9 * u_prime * my_y / (4 * v_prime);
my_z = (12 - 3 * u_prime - 20 * v_prime) * my_y / (4 * v_prime);
b = (float) ( int((RGB[0][0]*my_x + RGB[0][1]*my_y + RGB[0][2]*my_z)*255.0) );
g = (float) ( int((RGB[1][0]*my_x + RGB[1][1]*my_y + RGB[1][2]*my_z)*255.0) );
r = (float) ( int((RGB[2][0]*my_x + RGB[2][1]*my_y + RGB[2][2]*my_z)*255.0) );
if(b>255) b=255;
else if(b<0) b=0;
if(g>255) g=255;
else if(g<0) g=0;
if(r>255) r=255;
else if(r<0) r=0;
}
return TRUE;
}
*/
BOOL MyColorSpace::Rgb2Xyz(FLOAT r, FLOAT g, FLOAT b, FLOAT& x, FLOAT& y, FLOAT& z)
//RGB to CIE XYZitu(D65), 根据David Bourgin, Color space FAQ
{
x = (FLOAT) ( 0.431*r + 0.342*g + 0.178*b );
y = (FLOAT) ( 0.222*r + 0.707*g + 0.071*b );
z = (FLOAT) ( 0.020*r + 0.130*g + 0.939*b );
return TRUE;
}
BOOL MyColorSpace::Xyz2Rgb(FLOAT x, FLOAT y, FLOAT z, FLOAT& r, FLOAT& g, FLOAT& b)
//CIE XYZitu(D65) to RGB,根据David Bourgin, Color space FAQ
{
r = (FLOAT) ( 3.063*x - 1.393*y - 0.476*z );
g = (FLOAT) ( -0.969*x + 1.876*y + 0.042*z );
b = (FLOAT) ( 0.068*x - 0.229*y + 1.069*z );
return TRUE;
}
BOOL MyColorSpace::Xyz2Luv(FLOAT x, FLOAT y, FLOAT z, FLOAT& l, FLOAT& u, FLOAT& v)
//CIE XYZitu(D65) to CIE Luv,根据David Bourgin, Color space FAQ
//The white point is D65 and have coordinates fixed as (xn;yn)=(0.312713;0.329016).
//上面这句不懂意思。Xn、Yn和Zn的值来自D. Comaniciu, P. Meer,Robust Analysis of Feature Spaces: Color Image Segmentation 的相应代码
{
DOUBLE tempb = pow((y/Yn), (1.0/3.0));
if (y/Yn>0.008856)
{
l = (FLOAT) ( 116 * pow((y/Yn), (1.0/3.0)) );
}else
{
l = (FLOAT) ( 903.3 * y/Yn );
}
float up = 4 * x / (x+15*y+3*z);
float vp = 9 * y / (x+15*y+3*z);
float upn = 4 * Xn / (Xn+15*Yn+3*Zn);
float vpn = 9 * Yn / (Xn+15*Yn+3*Zn);
u = 13 * (l) * (up - upn);
v = 13 * (l) * (vp - vpn);
return TRUE;
}
BOOL MyColorSpace::Ycbcr2Rgb(FLOAT y, FLOAT cb, FLOAT cr, FLOAT& r, FLOAT& g, FLOAT& b)
//Rec 601-1 YCbCr to RGB, 根据David Bourgin, Color space FAQ
{
r = (FLOAT) ( y + 0.0000*cb + 1.4022*cr );
g = (FLOAT) ( y - 0.3456*cb - 0.7145*cr );
b = (FLOAT) ( y + 1.7710*cb + 0.0000*cr );
return TRUE;
}
FLOAT MyColorSpace::Labf(FLOAT input, FLOAT Y_Yn)
//用于计算Lab色彩;
{
if (Y_Yn>0.008856)
{
return (FLOAT)pow(input, (1.0/3.0));
}else
{
return (FLOAT) ( 7.787*input + 16./116. );
}
}
BOOL MyColorSpace::Xyz2Lab(FLOAT x, FLOAT y, FLOAT z, FLOAT& l, FLOAT& a, FLOAT& b)
//CIE XYZitu(D65) to CIE Lab, 根据David Bourgin, Color space FAQ
{
FLOAT y_yn = y / Yn;
if (y_yn>0.008856)
{
l = (FLOAT) ( 116. * pow(y_yn, 1./3.) );
}else
{
l = (FLOAT) ( 903.3 * y_yn );
}
a = 500 * ( Labf(x/Xn, y_yn) - Labf(y/Yn, y_yn) );
b = 200 * ( Labf(y/Yn, y_yn) - Labf(z/Zn, y_yn) );
return TRUE;
}
BOOL MyColorSpace::Lab2Lch(FLOAT li, FLOAT a, FLOAT b, FLOAT& lo, FLOAT& c, FLOAT& h)
//CIE Lab to CIE LCH, 根据David Bourgin, Color space FAQ
{
lo = li;
c = (FLOAT) ( pow( (a*a+b*b), 0.5) );
INT k= -1;
if (a>=0 && b>=0)
{
k = 0;
}else if (a>=0 && b<0)
{
k = 1;
}else if (a<0 && b<0)
{
k = 2;
}else if (a<0 && b>=0)
{
k = 3;
}
if (a==0)
{
h = 0;
}else
{
h = (FLOAT) ( (atan(b/a) + k*PI/2.) / (2.*PI) );
if (h<0)
{
h += (FLOAT) ( PI/2. );
}
}
return TRUE;
}
#define MAXV 256
BOOL MyColorSpace::RgbtoLuvPcm(BYTE* inDatas, int width, int height, MyLUV* luvbuff)
//基于表转换,将位图图像数据转换为LUV数据, 修改自D. Comaniciu, P. Meer,
//Robust Analysis of Feature Spaces: Color Image Segmentation 的相应代码
{
int x, y, z, my_temp;
float l_star, u_star, v_star;
float u_prime, v_prime;
//register int temp_col, temp_index, temp_ind;
register int j;//,k;
int a00=XYZ[0][0], a01=XYZ[0][1], a02=XYZ[0][2];
int a10=XYZ[1][0], a11=XYZ[1][1], a12=XYZ[1][2];
int a20=XYZ[2][0], a21=XYZ[2][1], a22=XYZ[2][2];
int *A00 = new int[MAXV]; int *A01 = new int[MAXV]; int *A02 = new int[MAXV];
int *A10 = new int[MAXV]; int *A11 = new int[MAXV]; int *A12 = new int[MAXV];
int *A20 = new int[MAXV]; int *A21 = new int[MAXV]; int *A22 = new int[MAXV];
for(j=0; j<MAXV; j++)
{
A00[j]=a00*j; A01[j]=a01*j; A02[j]=a02*j;
A10[j]=a10*j; A11[j]=a11*j; A12[j]=a12*j;
A20[j]=a20*j; A21[j]=a21*j; A22[j]=a22*j;
}
float *my_pow = new float[MAXV];
for(j=0; j<MAXV; j++)
my_pow[j]= (FLOAT) ( 116.0 * pow(j/255.0, 0.3333333) - 16 );
for ( j = 0; j < width*height; j++)
{
INT R = inDatas[j*3+2];
INT G = inDatas[j*3+1];
INT B = inDatas[j*3];
x = A00[R] + A01[G] + A02[B];
y = A10[R] + A11[G] + A12[B];
z = A20[R] + A21[G] + A22[B];
float tval = (FLOAT) ( y / 2550000.0 ); //Yn==1
if ( tval > Lt) l_star = my_pow[(int)(tval*255+0.5)];
else l_star = (FLOAT) ( 903.3 * tval );
my_temp = x + 15 * y + 3 * z;
if(my_temp)
{
u_prime = (float)(x << 2) / (float)(my_temp);
v_prime = (float)(9 * y) / (float)(my_temp);
}
else
{
u_prime = 4.0;
v_prime = (FLOAT) ( 9.0/15.0 );
}
tval = 13*l_star;
u_star = tval * (u_prime - Un_prime); // Un_prime = 0.1978
v_star = tval * (v_prime - Vn_prime); // Vn_prime = 0.4683
luvbuff[j].l = l_star;
luvbuff[j].u = u_star;
luvbuff[j].v = v_star;
}
delete [] my_pow;
delete [] A22; delete [] A21; delete [] A20;
delete [] A12; delete [] A11; delete [] A10;
delete [] A02; delete [] A01; delete [] A00;
return TRUE;
}
BOOL MyColorSpace::RgbtoLuv(BYTE* inDatas, int width, int height, MyLUV* luvbuff)
//将位图图像数据转换为LUV数据;
{
if (NULL == luvbuff)
{
CString tempstr;
tempstr.Format("传入内存未分配,在MyColorSpace::RgbtoLuv");
AfxMessageBox(tempstr,NULL,MB_OK);
return FALSE;
}
int i,j;
FLOAT r,g,b;
unsigned long pos;
for(i=0;i<height;i++)
{
for (j=0;j<width;j++)
{
pos = i*width+j;
r = (FLOAT)( (FLOAT)inDatas[3*pos+2] / 255. );
g = (FLOAT)( (FLOAT)inDatas[3*pos+1] / 255. );
b = (FLOAT)( (FLOAT)inDatas[3*pos] / 255. );
FLOAT x, y, z;
Rgb2Xyz(r, g, b, x, y, z);
FLOAT l, u, v;
Xyz2Luv(x, y, z, l, u, v);
luvbuff[pos].l = l;
luvbuff[pos].u = u;
luvbuff[pos].v = v;
}
}
return TRUE;
}
BOOL MyColorSpace::LuvToRgb(FLOAT* luvData, INT width, INT height, BYTE* rgbData)
{
if (NULL == rgbData)
{
CString tempstr;
tempstr.Format("传入内存未分配,在MyColorSpace::RGBtoHSV");
AfxMessageBox(tempstr,NULL,MB_OK);
return FALSE;
}
int i,j;
INT r,g,b;
FLOAT l, u, v;
unsigned long pos;
for(i=0;i<height;i++)
{
for (j=0;j<width;j++)
{
pos = (i*width+j) * 3;
l = luvData[pos];
u = luvData[pos+1];
v = luvData[pos+2];
Luv2Rgb(l, u, v, r, g, b);
rgbData[pos] = b;
rgbData[pos+1] = g;
rgbData[pos+2] = r;
}
}
return TRUE;
}
BOOL MyColorSpace::Luv2Rgb(FLOAT l, FLOAT u, FLOAT v, INT& r, INT& g, INT& b)
//LUV to RGB, 修改自D. Comaniciu, P. Meer,
//Robust Analysis of Feature Spaces: Color Image Segmentation 的相应代码
{
if(l<0.1)
{
r = g = b =0;
}
else
{
float my_x, my_y, my_z;
if(l < 8.0)
my_y = (FLOAT) ( Yn * l / 903.3 );
else
my_y = (FLOAT) ( Yn * pow((l + 16.0) / 116.0, 3) );
float u_prime = u / (13 * l) + Un_prime;
float v_prime = v / (13 * l) + Vn_prime;
my_x = 9 * u_prime * my_y / (4 * v_prime);
my_z = (12 - 3 * u_prime - 20 * v_prime) * my_y / (4 * v_prime);
r =int((RGB[0][0]*my_x + RGB[0][1]*my_y + RGB[0][2]*my_z)*255.0);
g =int((RGB[1][0]*my_x + RGB[1][1]*my_y + RGB[1][2]*my_z)*255.0);
b =int((RGB[2][0]*my_x + RGB[2][1]*my_y + RGB[2][2]*my_z)*255.0);
if(r>255) r=255;
else if(r<0) r=0;
if(g>255) g=255;
else if(g<0) g=0;
if(b>255) b=255;
else if(b<0) b=0;
}
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -