RGB转HSI公式及C++代码

标签:
hsi颜色空间 |
分类: 图像处理 |
以下文字部分大都摘录于《HSI与RGB颜色模型的转换方法对比研究》 刘华波
孟塞尔系统和较晚出现的Ostwald(1923年,德国)和PCCS(1964年,日本)等颜色表示系统都符合二个基本原则,一是颜色恒常性原则,即将亮度和色度(色调+饱和度)独立表示;
二是色度二极渐弱原则,即亮度适中时人眼对色彩的分辨力最强,颜色的种类最多,而亮度趋强或趋弱时,分辨力会降低,直至为零。
HSI色彩空间是从人的视觉系统出发,用色调(Hue)、色饱和度(Saturation或Chroma)和亮度 (Intensity
或Brightness)来描述色彩。HSI色彩空间可以用一个圆锥空间模型来描述。用这种描述HIS色彩空间的圆锥模型相当复杂,但确能把色调、亮度和色饱和度的变化情形表现得很清楚。通常把色调和饱和度通称为色度,用来表示颜色的类别与深浅程度。由于人的视觉对亮度的敏感程度远强于对颜色浓淡的敏感程度,为了便于色彩处理和识别,人的视觉系统经常采用HSI色彩空间,它比RGB色彩空间更符合人的视觉特性。在图像处理和计算机视觉中大量算法都可在HSI色彩空间中方便地使用,它们可以分开处理而且是相互独立的。因此,在HSI色彩空间可以大大简化图像分析和处理的工作量。
以下代码部分,是由本人写出,供大家参考
typedef unsigned char uint8;
void
CvtRGBToHSI(uint8 R, uint8 G, uint8 B, uint8& H, uint8& S,
uint8& I)
{
float i = (r + g + b)/3;
float s = 0.0f;
float h = 0.0f;
H
= (unsigned
char)Round(h*RGBMAX);
//range: 0 to 255;
S = (unsigned
char)Round(s*RGBMAX);
//range: 0 to 255;
I
= (unsigned
char)Round(i*RGBMAX);
//range: 0 to 255;
}
PelHSL24
TColorCvtor::CvtRGBToHSL(uint8 R, uint8 G, uint8 B, uint8& H,
uint8& S, uint8& L)
{
}
H
= (unsigned
char)Round(h*RGBMAX);
//range: 0 to 255;
S = (unsigned
char)Round(s*RGBMAX);
//range: 0 to 255;
L= (unsigned
char)Round(l*RGBMAX);
//range: 0 to 255;
}
温馨提示:如果你要对多幅图像进行转换,例如相机一边实时采集一边进行转换,则可以生成颜色转换表,图像颜色空间转换时直接查表即可,速度快;当然是要消耗内存的(48M内存,对于现在的计算机配置,这不算什么)。如果您是高性能PC,并且使用并行编程,N个核一起工作,另当别论。
前一篇:读《最美的教育最简单》
后一篇:编程风格