网维联盟

当前位置:   网站首页 >> cpp

rgb颜色和hsi互转

#define PI 3.14159265358979323846
#define Lim 0.001
/*
Lim在matlab中指最小的不等于0的正数,是matlab uint16数中最接近0的数,或者可以理解为可以使(1+Lim)>1为真的最小数。加Lim也就是为了在尽可能不影响计算结果的前提下避免0/0的情况出现的方法!
*/
//此处提供的rgb转成hsi的程序,结果提供的是double类型的结果,既用图像的double类型的数据计算的结果。如果要转成我们在书上见到的那种(H指角度范围在0到360度之间,S指色度值在0到1之间,I指亮度值在0到1之间)形式,可以在现有的H值上乘以360换算。
void rgb2hsi(unsigned char* pB,unsigned char* pG,unsigned char* pR,int width,int height,double *pH,double *pS,double* pI)
{
 int ii,jj;
 double R,G,B,H,S,I;
 double th,den;
 for (jj=0;jj<height;jj++)
 {
  for (ii=0;ii<width;ii++)
  {
    B=pB[jj*width+ii];
   G=pG[jj*width+ii];
      R=pR[jj*width+ii];
   
   th=0.5*((R-G)+(R-B));
   den=sqrt((R-G)*(R-G)+(R-B)*(G-B));
   if (B>G)
   {
    H=2*PI-acos(th/(den+Lim));
   }
   else
   {
    H=acos(th/(den+Lim));
   }
   H=H/(2*PI);
   th=min(R,G);
   th=min(th,B);
   den=R+G+B;
   if (den==0)
   {
    den=Lim;
   }
   S=1-3*th/den;
   if (S==0)
   {
    H=0;
   }
   I=(R+G+B)/3;

   pH[jj*width+ii]=H;
   pS[jj*width+ii]=S;
   pI[jj*width+ii]=I;

  }
 }

}
/****************************************************************************
*函数名称:hsi2rgb()
*函数参数: unsigned char* pH HSI模型H通道分量
   unsigned char* pS HSI模型S通道分量
   unsigned char* pI HSI模型I通道分量
   int width     图像的宽度
   int height    图像的高度
   unsigned char* pB RGB模型B通道分量
   unsigned char* pG RGB模型G通道分量
   unsigned char* pR RGB模型R通道分量
*函数返回值:无
*函数描述:将图像由HSI模型转换到RGB模型
*
***************************************************************************/
void hsi2rgb(double *pH,double *pS,double* pI,int width,int height,unsigned char* pB,unsigned char* pG,unsigned char* pR)
{
 int ii,jj;
// double p1,p2,p3;
 double R,G,B,H,S,I;
 for (jj=0;jj<height;jj++)
 {
  for (ii=0;ii<width;ii++)
  {
   H=pH[jj*width+ii]*2*PI;
   S=pS[jj*width+ii];
   I=pI[jj*width+ii];

   if (H>=0&&H<(PI*2/3))
   {
    B=I*(1-S);
    R=I*(1+S*cos(H)/cos(PI/3-H));
    G=3*I-(R+B);
   }
   else if (H>=(PI*2/3)&&H<(PI*4/3))
   {
    R=I*(1-S);
    G=I*(1+S*cos(H-2*PI/3)/cos(PI-H));
    B=3*I-(R+G);
   }
   else
   {
    G=I*(1-S);
    B=I*(1+S*cos(H-4*PI/3)/cos(5*PI/3-H));
    R=3*I-(G+B);
   }
   B=max(min(B,255),0);
   G=max(min(G,255),0);
   R=max(min(R,255),0);

   pR[jj*width+ii]=(int)R;
   pG[jj*width+ii]=(int)G;
   pB[jj*width+ii]=(int)B;
  }

 }
}
BYTE r = 221,g = 90, b=34;
	BYTE r2=148,g2=181,b2=199;
	double h,s,v,h2,s2,v2;
	rgb2hsi(&r,&g,&b,1,1,&h,&s,&v);
	rgb2hsi(&r2,&g2,&b2,1,1,&h2,&s2,&v2);
	printf("h:%f s:%f v:%f\n",h,s,v);
	printf("h2:%f s2:%f v2:%f\n",h2,s2,v2);


亲!有什么想法呢?
  • 流泪

    0

  • 打酱油

    0

  • 开心

    0

  • 鼓掌

    0

  • 恐怖

    0