天为什么是蓝色——纯正的天蓝色是什么样的?
今日不少北京的朋友在朋友圈晒出了漂亮的晚霞,欣赏美景之余不禁好奇,为何晚霞是红色呢?GPT 给出的回答无非绕不开瑞利散射对波长特性不一致,而落日时角度使得光路长度不一致,进而导致晚霞红色。但进一步深究,光路长度怎么影响到波长?傍晚红光穿透力强,蓝光被散射了,为何直射天空是蓝色的?GPT 就开始胡扯了。
晚霞是红色分析非常复杂,因为显然除了角度外,云层是必要的因素,涉及云那可就复杂多了。转念一想,我连为什么直射天是蓝色的也弄不清楚啊!网上说由于瑞利散射,波长小的散射效应更加明显,蓝光比红光波长小,容易被散射,蓝光被散射到处都是,天空就是蓝色啦。但可见光内紫光比蓝光波长不是更短吗,为什么天空不是紫色呢?
理论分析
光的传播离不开光源-介质-接收器,后文便也按这个思路分析:
光源:黑体辐射
太阳发光近似看作黑体,黑体辐射的波长-光强满足普朗克定律:
关于黑体:黑体能够吸收任意波长的入射电磁波,同时辐射的电磁波满足普朗克定律。说到黑体,印象中往往只要温度不变辐射就满足固定分布,这背后同时也隐含着吸收的能量,因为温度不变下,辐射能量完全等于吸收能量,吸收和辐射是一体俩面的。太阳能够近似为黑体,也源自极其的吸收能力。
太阳的温度约为 5778 K,其辐射曲线(光谱)如下:
其中绿色是可见光波长范围(380-780nm),选取了三个点,分别代表典型的紫光(410nm)、蓝光(475nm)以及红光(685nm)的波长。
可以看到蓝光的波长接近辐射极大值,这是否是天空呈现蓝色的原因呢?且待后文进一步分析。
关于光谱:光谱的概念很像频域,如果按频域的概念,信号实际上是一堆在正交坐标系下分解的分量的叠加(加权和),横坐标代表频域,纵坐标代表该频率分量大小,则原始信号则是按照某种加权积分(傅里叶逆变换)。但光并非可以简单叠加不同频率的成分,绘制光谱暗含了假设各个成分是非偏振的。这个理解很合理,因为正交意味着相互垂直,没有投影,互不干扰,只有非偏振,各向振幅随机才能满足该性质。
介质:瑞利散射
瑞利散射描述了散射下角度、波长以及光强之间的关系。什么是散射?听名称,散射既改变了传播方向,又增加了传播路径的数量,也就是折射plus。全反射也是“聚是一团火,散是满天星”,全反射是否也是散射呢?询问 GPT 老师,散射还隐含着偏向性,即各向异性的,而全反射是各向同性的。所以散射是改变了传播方向、增加了传播路径数量且满足各向异性的一种玩意儿。
弄明白散射再来看看瑞利散射,其公式如下:
其中 \(I_0\) 是原始光强,\(\theta\) 是散射角(散射方向和原始方向夹角),\(R\) 代表接受距离散射点距离,\(r\) 代表散射粒子半径。
抽离和波长相关的部分,散射强度和波长 \(\lambda\) 成四次方反比,假设 \(\lambda \rightarrow 0\),岂不是有光强 \(I_s \rightarrow \infty\) 的离谱结论?原来瑞利公式成立需要满足 \(r << \lambda\),散射粒子足够小,远远小于波长。空气分子尺寸大概在 0.1~1 nm 数量级,远远小于可见光 100nm 的量级,瑞利散射成立。但对于 PM 2.5,2.5um 左右的颗粒就不满足瑞利散射的条件了我知道是达尔文效应(雾)。
从散射角看,\(\theta\) 为 0 或 180 ° 时角度因子最大,90 ° 时因子最小,也就是散射光在正向或者反向强度最大,在侧向最小。
实际光线经过厚厚的大气层,不断散射散射,所看到的光是散射光的累加。但这样分析太过复杂,不妨假设大气厚度趋于0,只散射一次,且正午太阳直射,我们以 \(90° - \theta\) 角度抬起脑袋仰望天空,接受到了距离为 \(R\) 处发生散射的光线。也就是说,只考虑和波长成四次方反比。
接收器:三视锥细胞
光进入眼前含有一堆复杂成分,人是怎么处理将其映射到某一个颜色的呢?
肉眼中存在三种视锥细胞,分别对可见光内不同的成分敏感。对于一个成分为 \(S(\lambda)\) 的光,有公式:
其中 \(\overline{x}, \overline{y}, \overline{z}\) 叫做 Color Matching Functions, 代表不同视锥细胞对颜色的刺激。对多数个体实验记录得到函数形式大概如下:
CMF 在频域上按光频率强度在可见光范围积分,得到得称作对于该视锥细胞的刺激值。X、Y、Z 的比例,反应了得到颜色的色相,X、Y、Z 总刺激的平均,反应了颜色的光强。
刺激值和色相的转换可视化图如下,称作 CIE 1931 色度空间,横纵坐标代表 X、Y 刺激值,因为色相只需要反映三者比例,归一化只需要二维表示。而图形的边缘,正好是纯色可见光的色相,因此能直接对应波长。
看 DNN 早期可解释性就有用这个模型解释的,CMF 相当于权重,\(S(\lambda)\) 相当于输入 feature,加权积分就是 MAC,而从刺激值到色彩空间的变换是非线性的相当于激活函数。不过引用陈云霁老师的话,人工神经网络之于神经网络,米老鼠之于老鼠啦!
实验结论
选取 380-780nm 范围作为可见光范围,
- 根据普朗克公式计算出 5578K 下可见光波长内的光谱;
- 经过瑞利散射,按照波长四次方反比关系滤波信号;
- 最后和 CMF 加权求积分,结果转换到 RGB 空间
可视化颜色,如图:
R: 140, G: 178, B: 253,就是在这个简单模型下的纯正的天蓝色!
消融实验
蓝色是否是黑体辐射引起的呢?假设光强按均匀分布,最后得到的颜色数值也近似天蓝色,数值为 R:147 G:176 B:254,变化很小,所以蓝色并非是由黑体辐射导致光源波长分布不均匀导致。
而若取消瑞利散射的滤波,则得到近似白色。所以蓝天是因为瑞利散射的结论是正确的。
之于天为什么不是紫色从数学上也大概能看出,总体颜色是对各个波长的积分,在紫色红色一搅合,最后呈现中间的蓝色了。
这么说,网上一般说法瑞利散射,对蓝光散射强,红光散射弱,所以呈蓝色不完全正确。严谨的表述应是:瑞利散射波长短散射强,波长强散射弱,可见光内紫光散射强,红光散射弱,一强一弱,原本混合白色的太阳光向中间的蓝色偏移了。
相关代码开源在 github