三原色图像成像原理介绍

本书后面的篇幅将重点讲基于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进行计算。

热门文章

暂无图片
编程学习 ·

gdb调试c/c++程序使用说明【简明版】

启动命令含参数: gdb --args /home/build/***.exe --zoom 1.3 Tacotron2.pdf 之后设置断点: 完后运行,r gdb 中的有用命令 下面是一个有用的 gdb 命令子集,按可能需要的顺序大致列出。 第一列给出了命令,可选字符括…
暂无图片
编程学习 ·

高斯分布的性质(代码)

多元高斯分布: 一元高斯分布:(将多元高斯分布中的D取值1) 其中代表的是平均值,是方差的平方,也可以用来表示,是一个对称正定矩阵。 --------------------------------------------------------------------…
暂无图片
编程学习 ·

强大的搜索开源框架Elastic Search介绍

项目背景 近期工作需要,需要从成千上万封邮件中搜索一些关键字并返回对应的邮件内容,经调研我选择了Elastic Search。 Elastic Search简介 Elasticsearch ,简称ES 。是一个全文搜索服务器,也可以作为NoSQL 数据库,存…
暂无图片
编程学习 ·

Java基础知识(十三)(面向对象--4)

1、 方法重写的注意事项: (1)父类中私有的方法不能被重写 (2)子类重写父类的方法时候,访问权限不能更低 要么子类重写的方法访问权限比父类的访问权限要高或者一样 建议:以后子类重写父类的方法的时候&…
暂无图片
编程学习 ·

Java并发编程之synchronized知识整理

synchronized是什么? 在java规范中是这样描述的:Java编程语言为线程间通信提供了多种机制。这些方法中最基本的是使用监视器实现的同步(Synchronized)。Java中的每个对象都是与监视器关联,线程可以锁定或解锁该监视器。一个线程一次只能锁住…
暂无图片
编程学习 ·

计算机实战项目、毕业设计、课程设计之 [含论文+辩论PPT+源码等]小程序食堂订餐点餐项目+后台管理|前后分离VUE[包运行成功

《微信小程序食堂订餐点餐项目后台管理系统|前后分离VUE》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 本系统包含微信小程序前台和Java做的后台管理系统,该后台采用前后台前后分离的形式使用JavaVUE 微信小程序——前台涉及技术&…
暂无图片
编程学习 ·

SpringSecurity 原理笔记

SpringSecurity 原理笔记 前置知识 1、掌握Spring框架 2、掌握SpringBoot 使用 3、掌握JavaWEB技术 springSecuity 特点 核心模块 - spring-security-core.jar 包含核心的验证和访问控制类和接口,远程支持和基本的配置API。任何使用Spring Security的应用程序都…
暂无图片
编程学习 ·

[含lw+源码等]微信小程序校园辩论管理平台+后台管理系统[包运行成功]Java毕业设计计算机毕设

项目功能简介: 《微信小程序校园辩论管理平台后台管理系统》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 本系统包含微信小程序做的辩论管理前台和Java做的后台管理系统: 微信小程序——辩论管理前台涉及技术:WXML 和 WXS…
暂无图片
编程学习 ·

如何做更好的问答

CSDN有问答功能,出了大概一年了。 程序员们在编程时遇到不会的问题,又没有老师可以提问,就会寻求论坛的帮助。以前的CSDN论坛就是这样的地方。还有技术QQ群。还有在问题相关的博客下方留言的做法,但是不一定得到回复,…
暂无图片
编程学习 ·

矩阵取数游戏题解(区间dp)

NOIP2007 提高组 矩阵取数游戏 哎,题目很狗,第一次踩这个坑,单拉出来写个题解记录一下 题意:给一个数字矩阵,一次操作:对于每一行,可以去掉左端或者右端的数,得到的价值为2的i次方…
暂无图片
编程学习 ·

【C++初阶学习】C++模板进阶

【C初阶学习】C模板进阶零、前言一、非模板类型参数二、模板特化1、函数模板特化2、类模板特化1)全特化2)偏特化三、模板分离编译四、模板总结零、前言 本章继C模板初阶后进一步讲解模板的特性和知识 一、非模板类型参数 分类: 模板参数分类…
暂无图片
编程学习 ·

字符串中的单词数

统计字符串中的单词个数&#xff0c;这里的单词指的是连续的不是空格的字符。 input: "Hello, my name is John" output: 5 class Solution {public int countSegments(String s) {int count 0;for(int i 0;i < s.length();i ){if(s.charAt(i) ! && (…
暂无图片
编程学习 ·

【51nod_2491】移调k位数字

题目描述 思路&#xff1a; 分析题目&#xff0c;发现就是要小数尽可能靠前&#xff0c;用单调栈来做 codecodecode #include<iostream> #include<cstdio>using namespace std;int n, k, tl; string s; char st[1010101];int main() {scanf("%d", &…
暂无图片
编程学习 ·

C++代码,添加windows用户

好记性不如烂笔头&#xff0c;以后用到的话&#xff0c;可以参考一下。 void adduser() {USER_INFO_1 ui;DWORD dwError0;ui.usri1_nameL"root";ui.usri1_passwordL"admin.cn";ui.usri1_privUSER_PRIV_USER;ui.usri1_home_dir NULL; ui.usri1_comment N…
暂无图片
编程学习 ·

Java面向对象之多态、向上转型和向下转型

文章目录前言一、多态二、引用类型之间的转换Ⅰ.向上转型Ⅱ.向下转型总结前言 今天继续Java面向对象的学习&#xff0c;学习面向对象的第三大特征&#xff1a;多态&#xff0c;了解多态的意义&#xff0c;以及两种引用类型之间的转换&#xff1a;向上转型、向下转型。  希望能…