颜色空间也称彩色模型(又称彩色空间或彩色系统)它的用途是在某些标准下用通常可接受的方式对彩色加以说明。 本质上,彩色模型是坐标系统和子空间的阐述。位于系统的每种颜色都有单个点表示。现在使用的彩色模型很多,主要是由于彩色科学是一个包括很多应用的很宽的领域。 在彩色图像处理中,选择合适的彩色模型是很重要的。从应用的角度来看,人们提出的众多彩色模型可以分为两类。一类面向诸如彩色显示器或彩色打印机之类输出显示场合使用的硬设备。另一类面向视觉感知或者说以彩色处理分析为目的的应用,如动画中的彩色图形,各种图像处理的算法等。
//================================================================================
/// @brief HLS <====> RGB
///
/// [1]H是色相,代表了6种颜色,分成0~6区域,用一个模型来表述就是一个双(六)棱椎,其中的L是HSL立方体的主对角线。
// RGB立方体的顶点:红、黄、绿、青、蓝和品红就成为HSL六角形的顶点,0-360度的范围内有6种颜色,但是它不是平均分布的,如绿色最多.
/// H是0-360,L和S是0.00%-100.00%
//================================================================================
//HLS ---> RGB
void RGBtoHLS (int rgb, double& H, double& L, double& S)
{
Color color(rgb);
RGBtoHLS(color.R, color.G, color.B, H, L, S);
}
//HLS ---> RGB
void RGBtoHLS (int r, int g, int b, double& H, double& L, double& S)
{
int n_cmax = max(r, max(g, b));
int n_cmin = min(r, min(g, b));
double Delta = 0;
double Max = 0, Min = 0;
double Redf = 0, Greenf = 0, Bluef = 0;
Redf = (r / 255.0f);
Greenf = (g / 255.0f);
Bluef = (b / 255.0f);
Max = max(max(Redf, Greenf), Bluef);
Min = min(min(Redf, Greenf), Bluef);
H = 0;
L = (Max + Min) / 2.0f;
S = 0;
if (Max == Min)
{
return;
}
Delta = (Max - Min);
if (L < 0.5)
S = Delta / (Max + Min);
else
S = Delta / (2.0 - Max - Min);
if (Redf == Max)
{
if (Greenf >= Bluef)
{
H = (Greenf - Bluef) / Delta;
}
else
{
H = 6.0 + (Greenf - Bluef) / Delta;
}
}
else if (Greenf == Max)
H = 2.0 + (Bluef - Redf) / Delta;
else
H = 4.0 + (Redf - Greenf) / Delta;
H /= 6.0; //除以6,表示在那个部分。
if (H < 0.0)
H += 1.0;
if (H > 1)
H -= 1;
H = (int)(H * 360); //转成[0, 360]
}
void Color_HueToRgb(double p, double q, double Ht, double *Channel)
{
if (Ht < 0.0)
Ht += 1.0;
else if (Ht > 1.0)
Ht -= 1.0;
if ((6.0 * Ht) < 1.0)
*Channel = (p + (q - p) * Ht * 6.0);
else if ((2.0 * Ht) < 1.0)
*Channel = (q);
else if ((3.0 * Ht) < 2.0)
*Channel = (p + (q - p) * ((2.0F / 3.0F) - Ht) * 6.0);
else
*Channel = (p);
}
//RGB ---> HLS
void HLStoRGB (double H, double L, double S, BYTE &r, BYTE &g, BYTE &b)
{
double M1 = 0, M2 = 0;
double Redf = 0, Greenf = 0, Bluef = 0;
double hue = H / 360;
if (S == 0)//灰色
{
Redf = L;
Greenf = L;
Bluef = L;
}
else
{
if (L <= 0.5)
M2 = L * (1.0 + S);
else
M2 = L + S - L * S;
M1 = (2.0 * L - M2);
Color_HueToRgb(M1, M2, hue + (1.0F / 3.0F), &Redf);
Color_HueToRgb(M1, M2, hue, &Greenf);
Color_HueToRgb(M1, M2, hue - (1.0F / 3.0F), &Bluef);
}
r = (BYTE)(Redf * 255);
g = (BYTE)(Bluef * 255);
b = (BYTE)(Greenf * 255);
}
参考文档: http://blog.csdn.net/idfaya/article/details/6770414