这几天在看openGL(这里不讨论open gl中的光,我没有弄懂),对于光与颜色存在疑惑。
先来看看光与颜色的概念。
出处:光
光是一个物理学名词,其本质是一种处于特定频段的光子流。光源发出光,是因为光源中电子获得额外能量。如果能量不足以使其跃迁到更外层的轨道,电子就会进行加速运动,并以波的形式释放能量。如果跃迁之后刚好填补了所在轨道的空位,从激发态到达稳定态,电子就不动了。否则电子会再次跃迁回之前的轨道,并且以波的形式释放能量。
出处:OpenGL中的光照系列之一[基本理论]
image.png
什么是颜色
颜色只是某种波长的光,能够被肉眼看到。在高中物理中我们知道光分为很多类型,包括可见光、红外线、紫外线、X射线等,我们眼睛可以接受的只是其中某个波段的光,下图是可见光的波普范围:
当一个物体我们说它是红色时,实际上它并不是红色,它只是反射红色的光(而吸收了其他颜色的光),这样我们眼睛接受到的都是红色的光,让我们觉得它是红色的。如果我们使用绿色的光去照射它,那么我们实际上什么也看不到(因为绿色的光都被物体吸收了),许多魔术师都用这种方式来“欺骗”我们的眼睛。
总而言之,只有光
是物理意义上存在的事物,颜色
在物理上并不存在,颜色
其实也是人类定义出的概念,只是人类对于事物的感知,然后人类定义了一些模型,例如RGB
和HSV
,用于对颜色
进行编码
或解码
(编码和解码只是将数据从一种形式转换成另一种形式的过程)。RGB或HSV的使用,是一个计算公式的使用。这个关系就类似于下面。
例如有2个方程式(这里类比RGB与HSV模型),你需要计算一个数据c (c就想象成颜色)。
方程式1 :c = x + y + z
(想象成RGB模型)
方程式2 :c = x² + y² + z²
(想象成HSV模型)
要想使c = 1(描述同一种颜色),2个方程式都可以做到,只是x、y、z的值不同。
把方程式简化一下,减少变量,就可以变成下面的方程式。
y= x
y= x²
这里回顾一下y = x与y = x²这2个方程的函数图形,一个是直线,一个是曲线,如下所示。
这些模型都是人类发展史中发现的,例如CIE协会通过实验,得出的1931 CIE-RGB模型,并且其他科学家也发表了一些模型(例如1978年由埃尔维·雷·史密斯创立的HSV),人类在多个领域(例如印刷、计算机、影音等)应用了这些颜色模型。
下面为Android中color使用rgb编码,解码的公式。
编码
int color = (A & 0xff) << 24 | (R & 0xff) << 16 | (G & 0xff) << 8 | (B & 0xff);
解码
int A = (color >> 24) & 0xff; // or color >>> 24
int R = (color >> 16) & 0xff;
int G = (color >> 8) & 0xff;
int B = (color ) & 0xff;
更多可参考这里:Color
最后,还有一个通道的概念。
出处:计算机视觉基础——数字图像与颜色空间
对于一张彩色数字图片,我们通常会将它表成一个H×W×C的3维矩阵。其中,H表示图片的宽,W表示图片的高,C表示图片的通道数。H×W描述的就是图片的分辨率,也就是像素点的个数。对于每一个像素点,都会表示一个颜色,用一个C维的向量描述。
C也就是channel的含义。
出处:为什么要了解图像深度和通道数
灰度图像只有1条通道来表示图片
BGR图像只有3条颜色通道,R(red,红色)通道、G(green,绿色)通道、B(blue,蓝色)通道。
而4通道数的图片也就是BGRA,A为alpha通道。
参考链接:
OpenGL中的光照系列之一[基本理论]
为什么颜色都用三维向量表示?
色彩空间基础
(11)1931 CIE颜色系统《颜色-不是你想象的那样》
深入理解color model(颜色模型)
计算机视觉基础——数字图像与颜色空间
为什么要了解图像深度和通道数
网友评论