在影像处理系统中,彩色空间变换时一个常见的基础功能,虽然功能不是特别复杂,但是也遇到了一些问题,毕竟第一次做图像处理的工作。在此,先介绍影像的RGB模型和HSI模型之间的转换。 在HSI模型中,H:Hue 代表色调(纯度、颜色)
S:Saturation 代表饱和度
I: Intensity 代表亮度
RGB转换为HSI模型的公式为:

HSI模型到RGB模型的公式为:

,有了公式之后,写代码就比较简单了。
RGB转换为HSI代码,单个像素转换的。
bool CRgbIhsAlgo::Rgb2Ihs(BYTE R,BYTE G,BYTE B,float &i,float &h,float &s)
{
float rValue = (float)R;
float gValue = (float)G;
float bValue = (float)B;
i = (float)(rValue + gValue + bValue);
if(i == 0) i = 1.0; //防止除数为0
float theta = 0.0;
float numerator = ((rValue-gValue)+(rValue-bValue))*0.5; //分子
float denominator = sqrt(pow(rValue-gValue,2)+(rValue-bValue)*(gValue-bValue)); //分母 denominator += 0.00000001; //加上一个很小的数,防止除数为0
float x = numerator/denominator;
theta = acos(x);
if (B<=G)
{
h = theta/(2*3.1415926);
}
else if (B>G)
{
h = (2*3.1415926-theta)/(2*3.1415926);
}
s = 1.0f - 3 * min(min(rValue,gValue),bValue)/i;
i = i/3;
return true;
}
//单个像素彩色逆变换的函数
static void HIStoRGB(float fh, float fi, float fs, BYTE& r, BYTE& g, BYTE& b)
{
int R, G, B;
float pi2 = 3.1415926*2;
fh *= pi2; //将H还原到0-360°
//注意三角函数的参数是弧度制
//H在0-120度之间
if((fh < pi2/3.0) && (fh >= 0.0))
{
B = fi*(1-fs);
R = fi*(1.0 + fs * cos(fh)/cos(pi2/6.0-fh));
G = 3*fi - (R + B);
}
//H在120-240度之间
else if((fh < 2*pi2/3.0) && (fh >= pi2/3.0))
{
fh -= pi2/3.0;
R = fi*(1-fs);
G = fi*(1.0 + fs * cos(fh)/cos(pi2/6.0-fh));
B = 3*fi - (R + G);
}
//H在240-360度之间
else
{
fh -= 2*pi2/3.0;
G = fi*(1-fs);
B = fi*(1.0 + fs * cos(fh)/cos(pi2/6.0-fh));
R = 3*fi - (B + G);
}
r = R>255?255:R; g = G>255?255:G; b = B>255?255:B;
}
同一副影像先由RGB转换到HSI之后,然后再转换到RGB时,理论上的像素值是没有变化的,但是实际上浮点运算会有误差,但是不过误差不大。

被折叠的 条评论
为什么被折叠?



