真彩与伪彩互相转换

来源:互联网 发布:淘宝卖家盗用图片 编辑:程序博客网 时间:2024/04/28 05:40
RGB空间与HSI空间的转换算法的C++实现
       
typedef struct    
{   
   
      BYTE   red;              // [0,255]   
   
      BYTE   green;            // [0,255]   
   
      BYTE   blue;             // [0,255]   
   
}COLOR_RGB;   
   


typedef struct 
{      
     float hue;                
   
     float saturation;        


     float intensity;         
   
}COLOR_HSI; 
   
// Converts RGB to HSI 
static void RGBtoHSI(/*[in]*/const COLOR_RGB *rgb, COLOR_HSI *hsi)   
{     
      double pi=3.1415926;
    double   r=(rgb->red / 255.0);                
      double   g=(rgb->green / 255.0);                  
      double   b=(rgb->blue / 255.0);
      
      double theta = acos(0.5 * ((r - g) + (r - b)) / sqrt((r - g) * (r - g) + (r - b) * (g - b))) / (2 * pi);


      hsi->hue = (b <= g) ? theta : (1 - theta);


      hsi->saturation = 1 - 3 * min(min(r, g), b) / (r + g + b);


      hsi->intensity = (r + g + b) / 3;
       
}   
//I = (1/3) *(R+G+B)
//S= 1 - ( (3/(R+G+B)) * min(R,G,B))
//H= cos^-1( ((1/2) * ((R-G) + (R - B))) / ((R-G)^2 + (R-B)*(G-B)) ^(1/2) )


// Converts HSI to RGB     
static void HSItoRGB(/*[in]*/const COLOR_HSI *hsi, /*[out]*/COLOR_RGB *rgb)   
{     
    double pi=3.1415926;
    double r, g, b; 


    double h = hsi->hue;
    double s = hsi->saturation;
    double i = hsi->intensity;


      h = h * 2 * pi;


            if (h >= 0 && h < 2 * pi / 3)
           {
                b = i * (1 - s);
                r = i * (1 + s * cos(h) / cos(pi / 3 - h));
                g = 3 * i - (r + b);
            }
            else if (h >= 2 * pi / 3 && h < 4 * pi / 3)
            {
                r = i * (1 - s);
                g = i * (1 + s * cos(h - 2 * pi / 3) / cos(pi - h));
                b = 3 * i - (r + g);
           }
           else //if (h >= 4 * Math.PI / 3 && h <= 2 * Math.PI)
           {
                g = i * (1 - s);
                b = i * (1 + s * cos(h - 4 * pi / 3) / cos(5 * pi / 3 - h));
                r = 3 * i - (g + b);
            }


     rgb->red = (BYTE)(r * 255.0 + .5);
    rgb->green = (BYTE)(g * 255.0 + .5);
     rgb->blue = (BYTE)(b * 255.0 + .5);