图像的RGB颜色空间和HSI空间的转换

来源:http://yzyanchao.blogbus.com/logs/20013780.html

//以下三个函数是用作RGB和HSI值转化,但是有误差。
double MinOfRGB(int R, int G, int B)
{
 if (R<G)
  if (R<B)
   return (double)R/(double)(R+G+B); //G>R,B>R 
  else
   return (double)B/(double)(R+G+B); //G>R>B
 else
  if (G>B)
   return (double)B/(double)(R+G+B); //R>G>B
  else
   return (double)G/(double)(R+G+B); //R>G, R>B
}

void RGBtoHSI(int R,int G,int B,int &H,int &S,int &I)
{
 double r,g,b;
 r = (double)R/(double)(R+G+B);
 g = (double)G/(double)(R+G+B);
 b = (double)B/(double)(R+G+B);

 double h,s,i;

 if (B<=G)
  h = acos( 0.5*(r-g+r-b) / sqrt((r-g)*(r-g)+(r-b)*(g-b)) );
 else
  h = 2*PI - acos( 0.5*(r-g+r-b) / sqrt((r-g)*(r-g)+(r-b)*(g-b)) );

 s = 1 - 3*MinOfRGB(R,G,B);
 i = (double)(R+G+B)/3/255;
 
 H = h*180/PI;
 S = s*100;
 I = i*255; 
}

void HSItoRGB(int H,int S,int I,int &R,int &G,int &B)
{
 double h,s,i;

 h = (double)H*PI/180;
 s = (double)S/100;
 i = (double)I/255;

 int flag;
 if ( h < (2*PI/3) )
  flag = 0;
 else if ( h >= (2*PI/3) && h < (4*PI/3) )
 {
  flag = 1;
  h -= 2*PI/3;
 }
 else
 {
  flag = 2;
  h -= 4*PI/3;
 }

 double x,y,z;

 x = i*(1-s);
 y = i*(1 + s*cos(h) / cos(PI/3-h));
 z = 3*i-x-y;

 double r,g,b;

 if ( flag == 0 )
 {
  b = x;
  r = y;
  g = z;
 }

 else if ( flag == 1 )
 {  
  r = x;
  g = y;
  b = z;
 }

 else if ( flag == 2 )
 {
  g = x;
  b = y;
  r = z;
 }

 R = r*255;
 B = b*255;
 G = g*255;
}

    这三个函数实现了一对RGB和HSI值间的转换,对于整张图像,一个像素一个像素地这样转换就可以了。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值