--- title: "光场、颜色和感知" date: 2022-07-30T16:49:52+08:00 --- ## 光场(Light Field/Lumigraph) 两个都指光场,来源于该现象由两个不同组各自法线并命名,现在仍然有争论 ### 我们看到的世界是什么 坐在房间的一侧往窗户的一侧看,三维和二维的情况是下面这样的 ![](../../images/color_and_perception_1.png) 如果加上一个幕布,显示上图图像,往往人们难以区别于现实世界,即为虚拟现实的原理 ![](../../images/color_and_perception_2.png) ### 全光函数(The Plenoptic Function) * 函数 Grayscale snapshot 统计往任意方向上的所见值,可定义一个函数,最后结果为一个数 ![](../../images/color_and_perception_4.png) * 改进函数 Color snapshot 改进后引入波长,即为引入颜色(因光的不同波长而产生颜色) 记录各个方向看到的不同方向上的光,就可以看到彩色场景 ![](../../images/color_and_perception_5.png) * 扩展的全光函数 A movie 进一步将全光函数扩展一个时间t,那下面这个四维的函数就是电影,因为你可以往各个不同的方向看,看到各个不同方向来的信息都是彩色的,然后在不同时间显示的东西不一样 ![](../../images/color_and_perception_6.png) * 进一步扩展 Holographic movie 现在考虑人/摄像机可以在三维空间中的任何地方移动,三维空间中的任何一个位置可以用x、y、z定义。那这也就是全息电影 ![](../../images/color_and_perception_7.png) * 再改进一步 The Plenoptic Function 将它理解成在任何位置,然后往任何方向看,并且在任何时间看到的都是不同的颜色,即为整个世界是一个7个维度的函数 将这个7维的函数当做全光函数 * 全光函数和光场 全光函数本身的定义: 在任何位置,任意方向,我们知道它过来的光是多少,方向也应是连续的,这就是一个简单的二维全光函数的表示 可以从全光函数中提取一部分信息出来,用来表示更复杂的光,就是说我们平常在一个点我们往任意方向看,那记录的是来自各个方向的光的信息,那光场就记录了更多的信息,光场就是全光函数的一个小部分 ![](../../images/color_and_perception_9.png) ## 光场 ### 定义光线 * 通过一个起点和一个方向定义 ![](../../images/color_and_perception_10.png) * 取光线上的任意两点定义整条光线(二维位置和方向) 物体可以放在一个包围盒中,从任何位置和任何方向看向这个物体,根据光路的可逆性,也可以认为要想描述这个物体所能被看到的所有的情况,就去描述这个物体在它的包围盒上在任何位置往任何方向过去的光线 已知包围盒上的点,观测位置的点,这两点确定一条光线,可以查询记录的函数,该函数记录了物体表面不同位置往各个不同方向的发光情况 ![](../../images/color_and_perception_11.png) ### 定义光场 光场:在任何一个位置往任何一个方向去的光的强度 如果有了一个物体的光场,如下图,任何一个位置往任何一个方向都可以发光。我们在任何一个位置往这个物体某个点看的时候,是可以知道这条光线带的能量是多少的,因为通过这2个点可以知道往这个点看的方向,就可以从4维的光场中查询到之前记录的光场的值,即光场可以给出任意观测方向看到的结果 ![](../../images/color_and_perception_12.png) ### 记录光场 * 记录上述将物体放在包围盒里后,盒子上的任何一个点往任何一个方向的光线 观测点必须在包围盒外 ![](../../images/color_and_perception_13.png) * 取一平面,平面右侧有有物体发出光线打到平面上 如图已知平面一点,二维只需$\theta$,三维则需两个数$(\theta,\phi)$ * 参数化光场 光线还可以用2个点来确定,那就可以用2个平面来定义一个光场 定义2个相互平行的平面,2个平面上各自任取一个点,连接两点即可确定光线 找到所有u、v和s、t的组合,可以描述所有的不同位置和不同方向出来的光线 ![](../../images/color_and_perception_14.png) ![](../../images/color_and_perception_15.png) ![](../../images/color_and_perception_16.png) 光场本质上就是一个4维的函数,不同记录方法即为描述方式不同 ### 对以上使用两个平面参数化 * u、v处取一点看向所有s、t平面 如下图,在u、v上取一个点,这个视角的右边是我们需要看到的东西,这就好像一个针孔摄像机所能看到的东西,所以能看到一个完整的物体的图。u、v上不同的位置出发,就相当于从不同的角度看向这个世界 ![](../../images/color_and_perception_17.png) 很多摄像机从某一个角度看向世界,拍一张图,然后将所有图都组织到一块,就是整个光场。如下图,斯坦福做了一个摄像机的矩阵,相当于在不同的位置对场景拍不同的图,每个位置对应一个u、v,拍到的照片是s、t,相机本身二维,成像结果二维,综合为四维 ![](../../images/color_and_perception_18.png) * 固定s、t平面上一个点,然后往u、v平面上看 整个世界还是在s、t平面的右边,从u、v上的任何一个点都看向s、t上的同一点。就好像盯着同一个点,从不同的角度去看,会看到很多类似不同高光的东西 通过这种方式,可以将像素上的Irradiance给展开成Radiance,可以看到打到任何一个像素上不同方向的光 ![](../../images/color_and_perception_19.png) 苍蝇的复眼成像原理就是成像一个光场,盯着原本拍出的一张照片来看,那照片上的任何一个像素记录的是Irradiance(平均各个方向的光) 如下图,普通相机记录下来的就是蓝色、绿色、红色的平均。如果有办法可以把它分开,比如这个光打到像素点时不立刻记录它,而是把这个像素变成某个小的透镜,把来自于各个方向的光给分到不同的位置上去(分光)。把实际的感光元件放在底下,就可以将它们分别记录到不同位置,此时就可以记录Radiance 此时看一个像素实际为穿过像素的不同方向的光 ![](../../images/color_and_perception_20.png) ## 光场相机 利用光场原理制作的相机 ### The Lytro Light Field Camera Lytro相机有下图这个人创办 ![](../../images/color_and_perception_21.png) * 原理:Microlens design(上面谈到的微透镜)。将一个像素替换成一个透镜,让这个透镜可以把来自于不同方向的光分开并记录下来 * 功能:支持拍照后的重新聚焦 * 具体效果如下图: ![](../../images/color_and_perception_22.png) * 详细原理 将原本的像素换成了微透镜,这些微透镜可以把来自各方向的光分散到不同的方向上去,在后面再将它记录下来 ![](../../images/color_and_perception_23.png) 光场照相机照出来的最原始的图实际上是原本的一个像素变成了一个圆,任何一个圆内部平均起来就是以前普通的照相机得到的结果,在一个圆的内部各个像素其实就是记录了各个不同的方向 ![](../../images/color_and_perception_24.png) * 得到普通相机照片 1. 透镜原本是像素,从透镜中各个不同的光线中选一条,如果都选最下面那条,并将结果记录在对应的一个像素上,现在透镜就对应了一个值 2. 每一个透镜都取中间这条光线,那就好像把相机放在正中间往左边去看 3. 都取最上面的往左下方打的光线,相当于相机在上面 类似于有光场后,取不同方向的光线就可以虚拟地移动摄像机位置 * 动态重新聚焦 与上述相同原理,在拥有整个光场时,在四维的光场中记录了所有可能的光线的位置和方向信息,那就可以查询更新了之后的光线应该查哪一条,那就对于不同的透镜查的可能并不是同一个位置,你算出来应该查询哪一个方向就去查询哪一个方向 * 问题 分辨率不足 原本成像平面在透镜的位置,现在成像平面在后面,每一个小块记录的是原本的普通相机对应的一个像素,如果都用相同的胶片,那原本一个像素记录一个像素的信息,现在要用100个像素记录一个像素的信息(假设是10x10的),因为把不同的方向分开了。也就是说胶片的分辨率现在变成了一个空间上的分辨率 方向上记录得越多,照片本身记录分辨率越低 高成本 1. 为了达到原有分辨率,要使用超级的分辨率的实际胶片 2. 微透镜的设计制造成本高,是一个超级精密的仪器 ----------------- ## 颜色 ### 颜色的物理基础 #### 光的基本成分 牛顿曾做过将一束白光穿过棱角,其会被分解成各个不同颜色 不同的颜色可以合成其他的颜色,将所有的颜色合在一起又会形成白色 ![](../../images/color_and_perception_25.png) #### 可见光谱 不同的波长对应不同的折射率,某一种光一定对应某一种光谱 光谱是光线的能量在不同的波长上的分布。光谱是一个很长的范围,图形学中重要的是可见光的光谱,即分布在波长在400nm到700nm之间 ![](../../images/color_and_perception_26.png) #### 谱功率密度(SPD) 光谱的准确定义名是谱功率密度 单位:辐射单位/纳米,也可能无单位 * 蓝天和太阳光的SPD 如下图可见: 蓝天部分更多的能量集中在高频 阳光则是另一种SPD ![](../../images/color_and_perception_27.png) #### 不同光源的SPD ![](../../images/color_and_perception_28.png) * SPD的线性性质 用一种光照亮能记录光强度的东西能够得到右边的另一种分布;两种光同时照亮得到的分布就是它们两个对应的SPD之和 ![](../../images/color_and_perception_29.png) ### 颜色的生物学基础 颜色可以认为是人的感知 ### 人眼结构 相机是人眼的仿生 人眼的瞳孔可调节大小,对应着光圈;晶状体对应透镜,可通过肌肉的拉扯调节焦距;视网膜进行成像 ![](../../images/color_and_perception_30.png) #### 视网膜感光细胞 * 棒状细胞: 很多(~120 million)感知光的强度,不感知颜色,可得灰度图 * 锥形细胞: 少(~6-7 million),可以用来感知颜色锥形细胞内部分成S、M、L这3种不同的锥形细胞(因为这三种细胞对三种类型的波长的响应各不相同) 1. S类型:感知小波长(高频) 2. M类型:感知中间波长 3. L类型:感知长波长 三种响应类型的曲线: ![](../../images/color_and_perception_31.png) * 三种细胞的分布和数量有个体差异,下图为12人锥形细胞分布差异 ![](../../images/color_and_perception_32.png) ### 颜色的三刺激理论 #### 人体如何利用三种细胞进行感知 已知光在不同波长上的分布(SPD),又知道某一种细胞对于某一个波长的响应是多少。感知的函数就是这2个函数对应的位置相乘积分起来 三种不同的细胞自然会感应出三种颜色,对应下图的S、M、L ![](../../images/color_and_perception_33.png) 给定任意类型光线,人眼看到的是上面S、M、L这3个数,而不是光线本身的SPD #### 人的视觉系统 光线的光谱经过人的眼睛,反应到视网膜上,然后被三种不同的细胞感知到形成3个数,这3个数送到人的脑袋中,人就会认为看到了一个什么样的颜色 ![](../../images/color_and_perception_34.png) #### 同色异谱 * 同色异谱现象 2种光线具有的光谱不相同,可是被我们看到的结果却是相同的 不同的信号进来后,通过积分得到3个数是相同的 * 颜色匹配 通过调和不同的光谱,得到某一种颜色,使得这一种颜色和我看到的另外一种颜色一样。并不需要2个光的光谱一样,只需要最后的颜色一样 下图中光谱的SPD完全不同,但被人感知后可得到三个相同的结果 ![](../../images/color_and_perception_35.png) * 应用 如图,可通过不同调节方式使两个颜色一致来表现显示器上太阳颜色,但混合后光谱可与之前的完全不同 ![](../../images/color_and_perception_36.png) ## 颜色复制/匹配 ### 颜色混合 加色系统: 有几种不同的原色,将各自不同的颜色乘上一个强度,将其混合起来,可以得到一种颜色,用它们各自混合的系数RGB这3个数来表示颜色 如果RGB的值都调到255会得到白色 减色系统: 类似于调和不同颜料会越调越黑 ![](../../images/color_and_perception_37.png) ### 加色实验 * 实验一 加色系统就可以使用上面的线性组合基本颜色的方式来匹配任何给定的颜色 如下图,给定任何一个颜色,希望用三种不同颜色混合匹配得到相同颜色 ![](../../images/color_and_perception_38.png) 左侧为给定颜色,右侧为混合颜色,每个颜色存在系数 ![](../../images/color_and_perception_39.png) 即找到三种颜色系数的值混合后得到左边颜色 ![](../../images/color_and_perception_40.png) * 实验二 有时存在左边的颜色右边无法混合得到的情况 ![](../../images/color_and_perception_41.png) 可在左边给定的颜色上加上一个颜色,类似于右边对应减去这个颜色 多个不同颜色混合得到一个颜色,存在负值可能 ![](../../images/color_and_perception_42.png) #### CIE RGB配色实验 CIE RGB系统开始接近颜色空间的表示 CIE是一个组织,定义了RGB系统,给定的任何一个颜色是单波长的颜色,光线的SPD是一个单一的函数 使用三种单色的光 ![](../../images/color_and_perception_43.png) #### 颜色匹配函数: * 单波长的目标颜色 做颜色匹配时,给定一个固定波长,需要将这3个颜色中相同波长的值混合起来 ![](../../images/color_and_perception_44.png) * 实际光(多波长) 给定一个实际光的SPD,要使用积分考虑每一个波长所需要的红、绿、蓝然后混合在一块 这三个颜色每一个积分出来会得到三个数 ![](../../images/color_and_perception_45.png) ### 颜色空间 #### Standard Color Spaces : Standardized RGB (sRGB) RGB的标准名为sRGB 广泛用于各种成像设备 问题: RGB颜色空间的色域有限 #### 国际颜色空间:CIE XYZ CIE XYZ系统人为定义了一个颜色匹配函数, * 绿色曲线分布比较对称,对应的y函数匹配出来的数Y在一定程度上可以表示颜色的亮度 * 红色有2个峰值,没有负数,这些函数都分布在可见光的范围内 ![](../../images/color_and_perception_46.png) 二维可视化XYZ 将X、Y、Z先进行归一化 $$x = \frac{X}{X+Y+Z}$$ $$y = \frac{Y}{X+Y+Z}$$ $$z = \frac{Z}{X+Y+Z}$$ 三个数相加为1,此时只需显示前面2个维度能得到一个什么样的图就可以了 改变Y即为改变亮度 ![](../../images/color_and_perception_47.png) * 色域 可见图中边界为扇形,这个就是色域,整个颜色空间可以显示的颜色 色域有一个白色中心,纯色都在边界上 ![](../../images/color_and_perception_48.png) 不同颜色空间表示的颜色范围不一样 下图sRGB只能表示很小的三角形部分的色域 ![](../../images/color_and_perception_49.png) ### Perceptually Organized Color Spaces #### HSV Color Space 广泛应用于颜色拾取器 可以选择各种不同的色调(Hue)、饱和度(Saturation)、Brightness(亮度)或Value(值) 色调:不同类型的颜色 饱和度:更接近中心白色,还是更接近颜色本身的纯色 亮度:从黑色一直到某种颜色 #### CIELAB Space LAB色彩空间也和感知有关 L轴表示的是亮度(0为黑,100为白) a轴上红和绿分别在两端 b轴上蓝和黄在两端 LAB空间认为任何一个轴上两端都是互补色 ![](../../images/color_and_perception_50.png) #### 互补色理论 人脑对互补色存在一个定义 * 人眼的视觉暂留来验证互补色 人眼的视觉暂留就是看一幅图看得时间长了,看到另外一幅图,你会看到第一幅图的互补色 #### 颜色是相对的 颜色本身是感知,看到的颜色可能和实际存在出入 如下图A,你会觉得B比A亮 ![](../../images/color_and_perception_51.png) 挡住A、B以外区域,会发现A和B颜色相同 ![](../../images/color_and_perception_52.png) ## 减色系统(CMYK) 减色系统在生活中应用更广泛 CMYK: Cyan(蓝绿色)、Magenta(品红色)、Yellow(黄色)、Key(黑色) ![](../../images/color_and_perception_53.png) C、M、Y可以通过混合得到各种不同的颜色,所以在打印上,可以通过混合各种各样不同墨水调出各种各样不同的颜色 ![](../../images/color_and_perception_54.png) 印刷上要考虑成本,正常情况下打印东西以黑色居多,而且黑色的墨水好制作,便宜,C、M、Y这三种带颜色的墨水不容易制作,那用这三种颜色混合得到黑色,成本就比直接用黑色高,因而需要黑色墨水