真彩与伪彩互相转换
来源:互联网 发布:淘宝卖家盗用图片 编辑:程序博客网 时间: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);
}
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);
}
- 真彩与伪彩互相转换
- 真静态与伪静态
- String 与 int 互相转换
- 字符串与整数互相转换
- LogFont与CharFormat互相转换
- JPG与BMP互相转换
- BitmapData 与 ByteArray 互相转换
- IList与 Xml互相转换
- XML与字符串互相转换
- HSV与RGB互相转换
- wchar与char互相转换
- Canvas与Image互相转换
- double 与 TimeSpane 互相转换
- IList与Xml互相转换
- YUV422与RGB互相转换
- list与jSONArray互相转换
- dp与pixel互相转换
- dp 与px互相转换
- JSP自制标签。以一只真正的菜鸟角度来审视自制标签。。。
- assertion failed: Path for IClasspathEntry must be absolute解决方法
- 徒弟离职引发的思考
- NotePad++ 格式化java插件
- Myclipse中修改类注释显示作者名称与当前日期
- 真彩与伪彩互相转换
- 好吧
- 唐僧团队的成功秘诀(转载)
- vi.不及物动词 vt. 及物动词 ad.是副词
- php中global 与 $GLOBALS[""] 的区别
- 深入了解JAVA内部类
- codeforces 7A - Kalevitch and Chess
- php 字符串函数
- Network Security Tools