什么是色彩模型
颜色模型指的是某个三维颜色空间中的一个可见光子集,它包含某个色彩域的所有色彩。一般而言,任何一个色彩域都只是可见光的子集,任何一个颜色模型都无法包含所有的可见光(通俗一点讲就是表示颜色的一种方式)
RGB模型
在计算机体系中,最常用的颜色空间是RGB模型,常用于颜色显示和图像处理,三维坐标的模型形式,主要是易于实现RGB三原色的组合表达各种颜色方便屏幕显示。学过物理的我们应该知道,可见光谱是连续的,而三原色RGB混合能形成其他的颜色,并不是说物理上其他颜色的光是由三原色的光混合形成的,每种单色光都有自己独特的光谱,如黄光是一种单色光,但红色与绿色混合能形成黄色,原因是人的感官系统所致,因为人眼感光细胞就是由红绿蓝三种感光细胞组成的。只能说“将三原色光以不同的比例复合后,对人的眼睛可以形成与各种频率的可见光等效的色觉。”
RGB 的局限
- RGB 颜色空间利用三个颜色分量的线性组合来表示颜色,任何颜色都与这三个分量有关,而且这三个分量是高度相关的,所以连续变换颜色时并不直观,想对图像的颜色进行调整需要更改这三个分量才行。
- 自然环境下获取的图像容易受自然光照、遮挡和阴影等情况的影响,即对亮度比较敏感。而 RGB 颜色空间的三个分量都与亮度密切相关,即只要亮度改变,三个分量都会随之相应地改变,而没有一种更直观的方式来表达。
- 人眼对于这三种颜色分量的敏感程度是不一样的,在单色中,人眼对红色最不敏感,蓝色最敏感,所以 RGB 颜色空间是一种均匀性较差的颜色空间。如果颜色的相似性直接用欧氏距离来度量,其结果与人眼视觉会有较大的偏差。对于某一种颜色,我们很难推测出较为精确的三个分量数值来表示。
- 所以RGB颜色空间适合于显示系统,却并不适合于图像处理。
RGB分类
RGB16:每个像素用16比特位表示,占2个字节
RGB565:RGB分量分别使用5位、6位、5位
RGB555:RGB分量分别使用5位,5位,6位
C++实现获取5位上的值:
#include <iostream>
using namespace std;
struct Color
{
unsigned int color : 15;
};
void getValueRGB555()
{
Color xColor = { 0b110000011100011 };
//0b11000 00111 00011
cout <<"xColor:" << xColor.color << endl;
int R = xColor.color >> 10;
//0x03E0: 0000 11 1110 0000
int G = (xColor.color & 0x03E0) >> 5;
//0000 0001 1111
int B = xColor.color & 0x001F;
cout << "R:"<< R << endl;
cout << "G:" << G << endl;
cout << "B:" << B << endl;
}
int main()
{
getValueRGB555();
return 0;
}
RGB24格式:每个像素用24比特位表示,占3个字节,在内存中RGB各排列顺序位:BGR
RGB32格式:每个像素用32比特位表示,占4个字节,R,G,B分量分别用8个比特位表示,存储顺序位B,G,R,最后8个字节保留
ARGB32:本质就是带alpha通道的RGB24,与RGB32的区别在于,保留的8个比特位用来表示透明,也就是alpha的值。
C++实现获取各个8位上的值
#include <iostream>
using namespace std;
void getValueRGB32()
{
int color = 0x0F0A0B0C;
cout << "color:" << color << endl;
int B = color >> 24; //第一个8位
int G = (color & 0x00FF0000) >> 16; //第二个8位
int R = (color & 0x0000FF00) >> 8; //第三个8位
int A = color & 0x000000FF; //最后一个8位
cout << "B:" << B << endl;
cout << "G:" << G << endl;
cout << "R:" << R << endl;
cout << "A:" << A << endl;
}
int main()
{
getValueRGB32();
return 0;
}