遥感影像彩色空间变换

    在影像处理系统中,彩色空间变换时一个常见的基础功能,虽然功能不是特别复杂,但是也遇到了一些问题,毕竟第一次做图像处理的工作。在此,先介绍影像的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;

}


HSI模型转换为RGB模型的代码,也是单个像素的。

	//单个像素彩色逆变换的函数
	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时,理论上的像素值是没有变化的,但是实际上浮点运算会有误差,但是不过误差不大。


  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值