最近做毕业设计时,需要Matlab仿真计算彩色物体的散射图像。计算中需要用到彩色图片(RGB色彩模式)对应的光波长数值。查找资料发现可以实现:由光波长求对应RGB数值。正在做尝试,所以来记录一下思路。
------------------------------------分割线------------------------------------
0516更新:由光波长计算RGB数值的Matlab脚本实现
% 输入指定波长,转换成RGB数值,并输出
% 输入波长范围:380~780 nm
function I = lambda2rgb(lambda)
I = [r,g,b];
if (lambda >= 380.0) && (lambda < 440.0)
r = -1.0 * (lambda - 440.0) / (440.0 - 380.0);
g = 0.0;
b = 1.0;
elseif (lambda >= 440.0) && (lambda < 490.0)
r = 0.0;
g = (lambda - 440.0) / (490.0 - 440.0);
b = 1.0;
elseif (lambda >= 490.0) && (lambda < 510.0)
r = 0.0;
g = 1.0;
b = -1.0 * (lambda - 510.0) / (510.0 - 490.0);
elseif (lambda >= 510.0) && (lambda < 580.0)
r = (lambda - 510.0) / (580.0 - 510.0);
g = 1.0;
b = 0.0;
elseif (lambda >= 580.0) && (lambda < 645.0)
r = 1.0;
g = -1.0 * (lambda - 645.0) / (645.0 - 580.0);
b = 0.0;
elseif (lambda >= 645.0) && (lambda <= 780.0)
r = 1.0;
g = 0.0;
b = 0.0;
else
r = 0.0;
g = 0.0;
b = 0.0;
end
% 在可见光谱的边缘处强度较低。
if (lambda >= 380.0) && (lambda < 420.0)
attenuation = 0.3 + 0.7 * (lambda - 380) / (420 - 380);
r = r * attenuation;
g = 0.0;
b = 1.0 * attenuation;
elseif(lambda >= 701.0) && (lambda < 780.0)
attenuation = 0.30 + 0.70 * (780.0 - lambda) / (780.0 - 700.0);
r = r * attenuation;
g = 0.0;
b = 0.0;
end
r = round(r*255);
g = round(g*255);
b = round(b*255);
end
------------------------------------分割线------------------------------------
1.光波长
可见光波长在780~400nm之间,是电磁波谱中人眼可以感知的部分。
而不同波长可见光呈现的颜色效果是不一样的,如下图:
2.RGB
RGB是一种颜色标准,通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的。RGB即是代表红、绿、蓝三个通道的颜色。RGB标准几乎包括了人类视力所能感知的所有颜色。
3.单色光与RGB
生活中,人眼可见的大部分色彩都不是单一波长的光产生的,而是由多种波长光混合而成。RGB作为一种色彩标准,表示为一种颜色视觉效果,所以是无法确定其中的光波长信息。
或者讲,不同比例的单色光混合,最终都可能有相同的颜色视觉效果,即相同的RGB数值。
反过来,光波长计算对应RGB值是可行的。这里,可以参考网络上的一些资料,里面有具体的计算方法。
https://www.en.silicann.com/blog/post/wavelength-color/