⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mycolorspace.cpp

📁 这是一个分水岭程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			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 + -