第2章 辐射度、光度和色度学基本理论

一、前言

         辐射度学(radiology)是一门以整个电磁波段(electromagnetic band)的电磁辐射能(electromagnetic radiation energy)测量为研究对象的科学。计算机图形学中涉及的辐射度学,则集中于整个电磁波段中的“光学谱段”(optical spectrum)中的“可见光谱段”的辐射能的计算。

        光学谱段是指从波长为0.1nm的X射线到波长约为0.1cm的极远红外线这一范围内的电磁波。波长小于0.1nm的是伽马射线,大于0.1cm的则属于微波和无线电波。

       光学谱段按波长分为X射线、远紫外线、近紫外线、可见光、近红外线、短波红外线、中波红外线、长波红外线和远红外线。可见光谱段即能对人眼产生目视刺激而形成光亮感和色感的谱段。可见光谱段的波长范围一般是0.38~0.76μm。

        对人眼产生总的目视刺激的度量是光度学(photometry)的研究范畴。

         对人眼产生色感刺激的度量是色度学(colorimetry)的研究领域。

1.1 辐射度学基本理论

        辐射度学研究的电磁波的辐射能是客观独立的,与观察者无关,即测量计算者和观察者的人眼感受没有关系。辐射度学建立在几何光学的基础上,即辐射是以直线传播的,不考虑电磁波干涉、衍射等性质。

        辐射通量定义为以辐射的形式发射、传输或者接受的功率,即单位时间内的辐射能,单位是W。

       不同波长的光引起人对不同颜色的感知,不同的辐射通量则引起人对光的不同亮度的感知。

        在空间中,光子的流动和传播遵循能量守恒定律。

        1.1.1 立体角

       给定一个正球体,它的半径为R。然后给定一个正圆锥体,正圆锥体的顶点和球心重合,到圆锥底面圆边上任意一点的连线,即正圆锥体斜高,它的值也为R。由正圆锥体的底面圆S所截取的那一部分球面的面积A和球体半径R的平方的比称为立体角(solid angle),其国际单位是球面度(steradian)。

       1.1.2 点光源、辐射强度和辐射亮度

        点光源和力学中的质点类似,只要当用来测定光的辐射的某个位置点,其与光源的距离是光源的最大尺寸的某倍时,该光源就可以被视为点光源,通常该倍数不小于15。

        辐射强度(radiation intensity)定义为在给定传输方向上,单位立体角内光源发出的辐射通量。

        辐射亮度(radiance)定义为辐射表面在其单位投影面积的单位立体角内发出的辐射通量。

752cb7f366004c7b926c6a5c78be1423.jpg

 ▲ 投影面积和辐射亮度示意图

      1.1.3 辐射出射度和辐射入射度

        辐射出射度(radiant exitance)定义为离开光源表面的单位面积的辐射通量。

        辐射入射度(irradiance,又译为“辐照度”)定义为单位面积被照射的辐射通量。

2.2 光度学基本理论

        和辐射度学相比,光度学的研究对象只限于可见光范围内,并且要以人眼的视觉特性为基础。

1e79b363442748218636892b616c9e36.jpg

 表2-1 辐射度量和光度量的名称、符号和定义式

        人眼的视觉特性有以下几种:

        1. 视敏特性    2. 亮度感觉特性   3. 彩色视觉   4. 分辨力

        光度量中最基本的物理量是发光强度,其单位是坎德拉(candela),记作cd。其定义为波长为555nm的光产生的辐射。

        光通量的单位是流明(lumen),记作lm。1lm是指光强度为1cd的均匀点光源在1球面度内发出的光通量。

2.3 色度学基本理论

        2.3.1 什么是颜色

        颜色或色彩是人们通过眼部、脑部及生活经验所产生的一种对光的主观感觉效应。人的视网膜上布满了感光细胞,当有光线传入人眼时,这些细胞就会将光线的输入刺激转化为传递给视神经的电信号,最终在大脑得到解释,形成“颜色”这一种意识感觉。

        2.3.2 颜色的数字化及ClE1931-RGB颜色模型

        因为人眼中有3种感知色彩的视锥细胞,所以理论上用3种不同颜色的光就可以混合出自然界中任何一种颜色来。

        国际照明委员会于1931年定义了一套标准:CIE1931-RGB标准色度系统。CIE1931-RGB颜色模型[插图]分别选择了波长为700nm、546 nm和436nm的这3种波长的光,作为产生三原色的基准,这3种光可称为三原色基准光,它们刺激光锥细胞,可以分别让人感觉到红、绿、蓝3原色。

        2.3.3 ClE1931-XYZ颜色模型

7c7ecae7b0164316898ddd5f8db2d22e.jpg

 ▲图2-10 CIE1931-XYZ颜色模型的色度图

        注意,图中的颜色只是一个效果示意。事实上,没有设备能把自然界中所有的颜色完全显示出来。

        CIE1931-XYZ颜色模型的色度图有如下性质需要注意。

        1)该色度图所示意的颜色包含了一般人可见的所有颜色,即人类可见的颜色范围。色度图的弧线边界对应自然中的单色光。图下方直线的边界则是由多种单色光混合而成。

        2)在该图中任意选定两点,两点间直线上的颜色可由这两点的颜色混合成。给定3个点,3个点构成的三角形内颜色可由这3个点的颜色混合成。

        3)给定3个真实光源,混合得出的色度只能是三角形框定的范围,无法完全覆盖人类视觉色域。

        这就是CIE1931-XYZ标准色度学系统。该系统是国际上色度计算、颜色测量和颜色表征的统一标准,是绝大多数测色仪器的设计与制造依据。

        2.3.4 ClE1931-Yxy颜色模型

        CIE1931-Yxy颜色模型由CIE1931-XYZ模型衍生得来。Yxy中的Y表示光的亮度,x和y则可以依据以下公式,从CIE1931-XYZ模型换算而来:

9c15d10b6e11448e8dce31a49c0647cb.jpg

         这个模型投影到x-y平面上,即得到图2-10中的CIE1931-XYZ色度图,其中x、y分量的取值范围是[0,1]。有时该模型也被称为CIE-xyY。

2.4 伽马校正和sRGB颜色空间

        韦伯-费希纳定律:由德国生理学家韦伯·费希纳所发现的描述人的心理量和物理量。

b7d280154c3443eda2c3a446842a5283.jpg

 式中,k为常数;ΔI为差别阈限;I为标准刺激强度。

        韦伯发现,同一个刺激差别量必须达到一定比例才能引起差别感觉,这一比例就是式(2-23)中的常数k。

        2.4.1 伽马校正

        人们经过大量的实践研究得到,在亮度领域,人眼的伽马值约为1/2.2,其幂函数图像也接近于指数值(伽马值)为1/2的曲线。

        之所以会存在伽马校正这样一个概念,是因为:①基于韦伯-费希纳定律所揭示的原因,人对颜色暗部细节变化的感觉要比对明部细节变化敏感得多;②由于存储空间的限制,只能在有限数量的存储空间中存放尽可能多的颜色数据,而且要使得这一系列颜色变化得均匀,需要在对颜色数据进行编码时尽可能地进行调整,以保留暗部细节。该调整过程就是伽马校正。

        2.4.2 sRGB颜色空间

        sRGB颜色空间是惠普公司与微软公司于1996年一起开发的用于显示器、打印机及互联网图像存储的一种标准RGB颜色空间。

        sRGB定义了红色、绿色与蓝色三原色的颜色,即在其他两种颜色值都为0时该颜色的最大值。

        2.4.3 Unity 3D中的伽马空间和线性空间

        Unity 3D有两个颜色空间(color space),即伽马空间(gamma space)和线性空间(linear space);以及基于这两种颜色空间所定义的工作流,即伽马工作流(gamma workflow)和线性工作流(linear workflow)。

        选用指数值为1的线性函数对其进行变换,得到的是依然呈线性分布的主观反射率(或目标颜色),称这些目标颜色构成的颜色空间为线性空间。

        选用一个指数值不为1的幂函数,把源颜色变换成目标颜色时,称这些目标颜色构成的颜色空间为伽马空间。

        虽然长久以来伽马空间是标准的开发用颜色空间,但使用线性颜色空间将能得到更精确的渲染结果。

        如果选择使用线性工作流,那么存储了颜色数据的纹理无论是在线性空间或伽马空间中创建的,都能正常工作。基于历史原因,图片文件中保存的颜色数据很多都已经转换到了伽马空间。而在渲染时,渲染器则需要使用基于线性空间的颜色数据,所以直接使用这些在伽马空间中的颜色数据会导致结果不准确。因此,在渲染计算时,需要使用sRGB采样器,这种采样器在对纹理采样过程中能把颜色数据从伽马空间转换到线性空间。

        Unity 3D引擎的计算生成光照贴图过程始终是在线性空间中完成的,而计算结果则变换到伽马空间后存储到光照贴图文件中去,即无论当前的工作流是线性工作流或者伽马工作流,Unity 3D引擎所生成的光照纹理都是相同的。

        在线性工作流下,且未使用HDR时,将使用特殊的帧缓冲器类型以支持sRGB读取和sRGB写入(读取时从伽马空间转换为线性空间,写入时则相反)。当此帧缓冲区用于混合或作为纹理绑定时,在使用之前将这些值转换为线性空间。写入这些缓冲区时,正在写入的值将从线性空间转换为伽马空间。如果以线性模式和非HDR模式进行渲染,则所有后期处理特效的源缓冲区和目标缓冲区都将启用sRGB读到和写入,以便后期处理和后期处理混合发生在线性空间中。

        在线性工作流下,如果提供给渲染器的纹理文件中的颜色数据原本就是基于线性空间,那需要设置此纹理文件禁用sRGB采样。

        如果当前的是伽马工作流,那么选中与取消选中sRGB(Color Texture)复选框都是没有意义的,因为在伽马工作流下是不会进行sRGB采样。另外,如果这些纹理是用来当作数据查找表,或者说是一个法线贴图,也不应对其进行校正,而是保持数据的原有值。

        虽然使用线性工作流能确保得到更精确的渲染画面,但若有些平台上的硬件只支持伽马空间,就不得不需要使用伽马工作流。当使用伽马工作流时,尽管用来计算的纹理颜色数据是在伽马空间中存储的,采样器在采样过程中也不会将其转换到线性空间中去。但Unity 3D着色器的计算代码依然以计算线性空间颜色的方法去计算处理这些被编码成伽马空间中的颜色数据,而且为了确保一个最终可接受的渲染结果,引擎会在向最终显示给用户看的帧缓冲区写入颜色数据时调整一些不匹配(mismatched)的值,而且在这个调整过程中不做伽马校正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/772304.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ARM.day8

1.自己设置温度湿度阈值,当温度过高时,打开风扇,蜂鸣器报警 2.当湿度比较高时,打开LED1灯,蜂鸣器报警 main.c #include "si7006.h" #include "CH1.h" #include "led.h" // 延时函数in…

【Redis】高频面试题

提供五种常见的数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)、Zset(有序集合) 文章目录 1、为什…

融云:社交泛娱乐出海,地区和赛道如何选?

“出海是这个时代给我们的机遇。”这是当前很多互联网出海人的心声。 走过跌宕起伏的 16 年出海历程,中国出海人现在面对与此前截然不同的市场环境,很多地区蓝海不再,也有不少赛道变得拥挤。 一体两面,如今的社交泛娱乐出海也已…

【TB作品】430单片机,单片机串口多功能通信,Proteus仿真

文章目录 题目功能仿真图程序介绍代码、仿真、原理图、PCB 题目 60、单片机串口多功能通信 基本要求: 设计一串口通信程序,波特率38400,通过RS232与PC机通信。 自动循环发送数据串(设计在程序中) 接收并存储和显示该数据串 在发送端定义10个ASCII码键0-9 按键发送单字节,PC机接…

Redis的安装与启动

一、Linux环境安装&启动Redis 1. 安装步骤 第一步:在官网下载好Redis安装包,上传到Linux中并进行解压到相应(如/opt/software/)目录中;(注意:完成了第二步后,即安装了C/C语言…

「媒体宣传」财经类媒体邀约资源有哪些?-51媒体

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 财经类媒体邀约资源包括但不限于以下几类: 商业杂志和报纸:可以邀请如《财经》、《新财富》、《经济观察报》等主流商业杂志和报纸。这些媒体通常具有较强的品牌影…

54、Qt/对话框、事件机制相关学习20240325

一、完善对话框,点击登录按钮,如果账号和密码匹配,则弹出信息对话框,给出提示”登录成功“,提供一个Ok按钮,用户点击Ok后,关闭登录界面,跳转到其他界面 如果账号和密码不匹配&#…

Android 8.1 预置应用开机自启动

Android 8.1 预置应用开机自启动 近来接到项目需求,要求将预置应用设置为开机自启动,具体修改参照如下: 方法一: /packages/apps/Launcher3/src/com/android/launcher3/model/LoaderTask.java private void loadWorkspace() {i…

Machine Learning机器学习之随机森林(Random Forests)

目录 前言: 思想与原理: 随机森林分类效果与什么因素有关: 经典的随机森林算法: 一、构建经典随机森林算法 1、思路 2、步骤: 3、代码实现 二、随机森林算法应用 建模步骤 Python代码实现(完整代码&#xf…

36.网络游戏逆向分析与漏洞攻防-游戏网络通信数据解析-数据解码器的实现

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 如果看不懂、不知道现在做的什么,那就跟着做完看效果 内容参考于:易道云信息技术研究院VIP课 上一个内容:35.登录成功数据…

Embedding模型提升效果的方法之一:Whitening和pooling

0. 前言 Embedding模型的主流框架基本上分为三类——基于bert结构的,基于GPT结构的和基于T5结构的,当然这些结构都是Transformer的变形。对于Embedding模型,使用bert结构目前看是最好的。有篇论文论文对基于bert的Embedding模型和基于GPT的E…

P3393 逃离僵尸岛 bfs +最短路

P3393 逃离僵尸岛 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路:bfs处理出高收费城市,将价格作为点权,将点权当作边权跑最短路。由于到达 v v v,且 v v v不是终点,那么还要再走这个时候需要在该点休息&#xf…

集合(下)Map集合的使用

文章目录 前言一、Map接口二、Map接口的实现类 1.HashMap类2.TreeMap类总结 前言 Map集合没有继承Collection接口,不能像List集合和Set集合那样直接使用Collection接口的方法。Map集合其自身通过以key到value的映射关系实现的集合,也有相应的许多方法。类…

前端实现导出xlsx功能

1.安装xlsx插件 npm install xlsx 2.示例 import XLSX from xlsx;// 示例数据 const data [[Name, Age, Country],[Alice, 25, USA],[Bob, 30, Canada],[Charlie, 28, UK] ];// 创建一个 Workbook 对象 const wb XLSX.utils.book_new(); const ws XLSX.utils.aoa_to_sheet…

前端理论总结(js)——reduce相关应用方法

按属性对object分类 let peple[{name:Alice,age:21},{name: Mex, age: 20},{name:Jane,age:20} }function groupBy (objectArray, property) {return objectArray.reduce(function(pre, cur){let keycur[property]if(!pre[key]){pre[key][]}pre[key].push(cur)return pre},{})…

CCCorelib 点云RANSAC拟合球体(CloudCompare内置算法库)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 RANSAC是一种随机参数估计算法。RANSAC从样本中随机抽选出一个样本子集,使用最小方差估计算法对这个子集计算模型参数,然后计算所有样本与该模型的偏差,再使用一个预先设定好的阈值与偏差比较,当偏差小于阈值时…

CUMT linux操作系统课程设计 任务2

先说题目: 调试Linux内核的启动过程,并在Linux 0.11内核进入保护模式之前添加提示信息 //这里吐槽一下,学校发的文档让你用断点去查看运行根本无法操作,报错如下: 所以别管这个报错,先跟着我来 第一题,调试…

各城市宗族文化姓氏占比数据

各城市宗族文化姓氏占比数据 1、指标:省份代码、所属省份、城市代码、所属城市、第1大姓氏、第2大姓氏、第3大姓氏、宗族文化强度 2、方法说明: 根据2005年全国1%的人口调查数据计算。其中第1大姓氏第一大姓人口数/总人口数,宗族文化强度(…

springboot如何通过注解优雅实现接口多版本管理

springboot如何通过注解优雅实现接口多版本管理 背景 一个web服务一旦上线后接口往往对接很多下游,下游应用可能强依赖这个接口,因此如果对接口进行版本更新最好是要兼容过去版本,提供一个相同功能的新版本。 接口版本管理的方式 通过请求…

【LeetCode】283. 移动零(Java自用版)

双指针 class Solution {public void moveZeroes(int[] nums) {int n nums.length;int right 0, left 0;while (right < n) {if (nums[right] ! 0) {swap(nums, left, right);left;}right;}}public void swap (int[] nums, int left, int right) {int temp nums[left];…