I need an algorithm or function to map each wavelength of visible range of spectrum to its equivalent RGB values.
Is there any structural relation between the RGB System and wavelength of a light?
like this image:
(source: kms at www1.appstate.edu http://www1.appstate.edu/~kms/classes/psy3203/Color/spectrum5.gif)
抱歉,如果这无关紧要:-]
我最近发现我的光谱颜色无法正常工作,因为它们基于非线性和移位数据。所以我做了很少的研究和数据整理,发现大多数光谱图像都是不正确的。此外,颜色范围彼此不匹配,因此我从此时起仅使用线性化的真实光谱数据,如下所示(原来的链接现在失效了 http://www.cfa.harvard.edu/ssp/images/SolarCCD.jpg):
这是我的修正输出:
- 第一个光谱是我发现的最好的渲染光谱,但仍然与真实的光谱相去甚远
- 第二个是从地球获取的太阳的线性光谱
- 最后一个是我当前的颜色输出
下面是RGB图:
这是两个图的合并:
现在的代码:
void spectral_color(double &r,double &g,double &b,double l) // RGB <0,1> <- lambda l <400,700> [nm]
{
double t; r=0.0; g=0.0; b=0.0;
if ((l>=400.0)&&(l<410.0)) { t=(l-400.0)/(410.0-400.0); r= +(0.33*t)-(0.20*t*t); }
else if ((l>=410.0)&&(l<475.0)) { t=(l-410.0)/(475.0-410.0); r=0.14 -(0.13*t*t); }
else if ((l>=545.0)&&(l<595.0)) { t=(l-545.0)/(595.0-545.0); r= +(1.98*t)-( t*t); }
else if ((l>=595.0)&&(l<650.0)) { t=(l-595.0)/(650.0-595.0); r=0.98+(0.06*t)-(0.40*t*t); }
else if ((l>=650.0)&&(l<700.0)) { t=(l-650.0)/(700.0-650.0); r=0.65-(0.84*t)+(0.20*t*t); }
if ((l>=415.0)&&(l<475.0)) { t=(l-415.0)/(475.0-415.0); g= +(0.80*t*t); }
else if ((l>=475.0)&&(l<590.0)) { t=(l-475.0)/(590.0-475.0); g=0.8 +(0.76*t)-(0.80*t*t); }
else if ((l>=585.0)&&(l<639.0)) { t=(l-585.0)/(639.0-585.0); g=0.84-(0.84*t) ; }
if ((l>=400.0)&&(l<475.0)) { t=(l-400.0)/(475.0-400.0); b= +(2.20*t)-(1.50*t*t); }
else if ((l>=475.0)&&(l<560.0)) { t=(l-475.0)/(560.0-475.0); b=0.7 -( t)+(0.30*t*t); }
}
//--------------------------------------------------------------------------
Where
-
l
是以 [nm] 为单位的波长 可用值是l = < 400.0 , 700.0 >
-
r,g,b
返回范围内的颜色分量< 0.0 , 1.0 >
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)