本书后面的篇幅将重点讲基于Matlab与FPGA的数字图像处理。但在正式开始之前,我们不得不再得巴拉巴拉一下,图像的成像原理。知其然要知其所以然,了解图像的成像原理,对于图像数据的组成,算法的处理以及显示成像等,均有帮助。
从牙牙学语起,我们开始认知世界的五彩斑斓,或是草丛的绿油,或是晚霞的红火,或是麦穗的金黄,或是大海的蓝色,亦或是惊艳的彩虹。我们无比迷恋那缤纷的花海,甘愿倾城沉醉那花香,这是来自大自然的馈赠,也是我们对色彩不懈追求与陶冶。
颜色通常由三个独立的分量来描述,相互综合得到最终的结果,这个三个变量变构成了一个XYZ空间坐标系,这就是颜色空间,而不同的颜色空间只是从不同的角度去衡量而已。颜色空间可以分成基本的两大类:三原色颜色空间,即RGB;色度/亮度颜色空间,即YUV/HSV(这里HSV不作为重点解释)。
计算机处理色彩为了匹配显示器,采用了RGB三原色,同时每种颜色有256个细分深度,因此三种颜色的分量混合叠加出224种颜色。红蓝绿三色能够混合出其他颜色,不是真的产生了其他颜色,只是你感觉上以为是那一种颜色。电视机上无论看上去是什么颜色,你用三棱镜做一下光谱,只能做出红蓝绿三种颜色,做不出自然光那样的彩虹式完整光谱。红蓝绿三原色的根本原因是我们人类的只有三种感光细胞,分别主要感知三个频段的光。红绿蓝三种颜色的频率正好落在这三个频段里,因此人类的眼睛结构被称作三色视觉系统。灵长类哺乳动物也都是三色视觉,而其他哺乳动物大多是两色视觉,鸟类则是四色视觉系统,海豚则是单色视觉系统。
YUV(YCbCr)是欧洲电视系统所采用的一种颜色编码方法,其向下兼容老式黑白电视,并且由于YUV422/YUV420等编码,可以有效地降低传输带宽。这里Y表示亮度,也就是灰阶值,而U/V则表示色度,用来描述色调及饱和度,用于指定像素的颜色。Y是由RGB特定部分叠加建立的,而Cr/Cb分别表示RGB输入信号红色/蓝色部分与RGB信号亮度之间的插值。如下给出了RGB与YUV的转换公式(后面的章节会有具体FPGA转换案例):
此外,颜色还有四原色技术,比如印刷机的CMYK,这里的C是Cyan青色,M是Magenta品红色,Y是Yellow黄色,而K则是Black黑色最后一个字母(防止与Blue冲突)。理论上三种油墨就够了,但是由于高纯度的油墨暂时还不能实现,因为CMY相加是暗红色,因此为了确保黑色的输出,增加了专门的黑墨来调和(本身黑墨也用的最多)。
后来显示器后来也有了四原色技术:RGBY,夏普就有采用四原色技术的3D液晶显示器,可大大的提高液晶显示器的色彩表现能力。不过RGBY也是在RGB三原色的基础上增加了黄色元素,其根本还是三原色。
所以,从理论上讲,三原色已经可以满足我们对颜色的构成需求,同时也吻合我们人类的视觉系统,本书图像处理也将基于RGB三原色进行算法实现。
为了研究RGB三原色模型,需要从光线的底层物理意义开始分析。光也属于电磁波,与电磁波有着同样的特性,因此这里给出了电磁波波谱图,如下图所示。
在电磁波波段中,400~700nm范围内为可见光波段,即人类肉眼可见的光。大自然的色彩均是由可见光组成的。雨后的彩虹,或者三棱镜色散后呈现的“红橙黄绿青蓝紫”,便是自然光(白光)分解的结果。分解后的光频率与波长如下表所示。
所谓三原色模型,是认为人眼里有三种感光细胞(锥状感光细胞),分别对红色、绿色和蓝色最敏感。人眼之所以能看到各种颜色的光,主要是这三种细胞感觉综合的结果,因此红色、绿色、蓝色被称为三原色。
人眼在光线充足的环境中能见到五颜六色,而在光线比较暗的情况下,只能观察到物理的敏感程度,却不能感受到五颜六色的斑斓。因此,相关研究表明,人眼还存在另外一种可见光细胞——柱状细胞,用于对光线强度进行感应。这四种感光细胞对波长的敏感程度如下图所示。
这里的RGB三种感光细胞都可覆盖可见光范围,但是每一种细胞最敏感的波长不同。分别将能感应RGB的细胞称为红视锥细胞、绿视锥细胞、蓝视锥细胞。而每一种细胞并非刚刚好对准响应颜色的波长中心值,这一点主要取决于人眼,而非电磁波。人眼所看到的彩色图像,是RGB以不同强度混合进入眼睛后综合出来的结果。由这三种细胞受到不同强度反映的结果组合出颜色,称为“三颜刺激”。
在计算机中,使用最广泛的就是RGB模型了。计算机使用离散的数字信号来描述数据,RGB模型也不例外。针对同一强度的RGB三原色,可以组成2*2*2=8种颜色,如上图所示。
饱和度均为 100%的RGB三原色组合模式与组合后的结果如下表所示。
1677万种颜色对于我们的人眼感光而言,已经足够表示真彩图像了。计算机的处理、大部分LCD的显示接口都采用了RGB888的模式。
当图像要求不是很高,同时设备带宽限制时,还可以采用RGB565、RGB444等三原色深度模型。由于人眼的分辨率有限,RGB565所组合产生的216=65536种颜色已经足够,所以在带宽、成本等条件限制下,RGB565也比较常用;同时,16bit彩色图像也更适用于16位宽存储器的缓存(以字节为单位,24bit存储器不常见),接下来的设计中采用的就是RGB565模型。
对于16bit彩色的显示,RGB分别占的位数为5 : 6 : 5模式,也就是红色用5位表示、绿色用6位表示、蓝色用5位表示,如下图所示。
RGB565已经能满足大部分场合的要求,但在要求较高的场合,一般采用RGB888、RGB30甚至更高深度的RGB,通过Gamma来提高图像的宽动态效果。
由于PC为RGB888色彩空间,因此本书后续章节图像处理,无论基于Matlab或者FPGA,均采用RGB888进行计算。