Python光学仿真实现波长与颜色之间对应关系示例解析

目录
  • 光的颜色
    • python实现为
    • 绘制光谱

光的颜色

与其说颜色是光的一种属性,不如说是人眼对可见光频率范围内的一种感应,是人眼的一种属性。而人眼对光频的感应包括三个方面,即明度、色调和饱和度。

其中,

  • 明度与光强有关
  • 色调反应的是光的频率信息
  • 饱和度表示图像上的颜色与光谱色的接近程度

当不考虑色调、饱和度为0的时候,只考虑明度,则色彩感消失,就是所谓的黑白图像,或者更严格地说是灰度图像。

色调与饱和度虽然反应色光的频率信息,但表现的是人眼对光的反馈特性,与光的频率是不同的物理量。其与光的频率之间的对应关系也是由人眼的感光细胞决定的。由于自然界中并不存在严格的单色光,人的色觉其实是人眼的两种感光细胞所产生的色觉的混合。

也就是说,几种基准频率的光按照不同的饱和度互相混合,人眼将会感受到颜色的变化,也可以说是产生新的颜色。实验表明,任意三种不能互相转换的颜色可以通过互相混合完成对光谱色的一一对应。这样的三种光叫做三原色,一般选取红绿蓝作为三原色。

由于三者已经归一化,所以只要知道其中两个值就能够确定色品,以 r 为横坐标 g 为纵坐标,就能够表示出所有可能的色品。这种图大家并不陌生,在手机发布会上最常见,这里我们画出一个类似的图样

def CIE_RGB():
    rgb = np.zeros([1000,1000,3])
    r = np.arange(0,1,0.001)
    r,g = np.meshgrid(r,r)
    rgb[:,:,0] = r
    rgb[:,:,1] = g
    rgb[:,:,2] = 1-r-g
    over = rgb[:,:,2]<0
    rgb[over,:]=[1,1,1]
    #将色品转化成RGB
    maxVal = np.max(rgb,2)
    for i in [0,1,2]:
        rgb[:,:,i] /= maxVal
    #rgb[rgb<0]=0
    ax = plt.gca()
    ax.imshow(rgb)
    ax.invert_yaxis()    #plt显示图片时y轴从上到下,所以反置
    # 坐标映射
    plt.xticks(range(0,1001,200),['0','0.2','0.4','0.6','0.8','1'])
    plt.yticks(range(0,1001,200),['0','0.2','0.4','0.6','0.8','1'])
    plt.show()

然而根据实验测得,RGB系统的刺激值存在负值,也就是说上图中其实并没有将所有的颜色纳入其中,所以CIE又推荐了XYZ色度学系统,其本质上是对RGB系统的线性变换,最终让该系统所对应的刺激值为正数。其公式为

python实现为

#dWave为波长;maxPix为最大值;gamma为调教参数
def getRGB(dWave,maxPix=1,gamma=1):
    waveArea = [380,440,490,510,580,645,780]
    minusWave = [0,440,440,510,510,645,780]
    deltWave = [1,60,50,20,70,65,35]
    for p in range(len(waveArea)):
        if dWave<waveArea[p]:
            break
    pVar = abs(minusWave[p]-dWave)/deltWave[p]
    rgbs = [[0,0,0],[pVar,0,1],[0,pVar,1],[0,1,pVar],
            [pVar,1,0],[1,pVar,0],[1,0,0],[0,0,0]]
        #在光谱边缘处颜色变暗
    if (dWave>=380) & (dWave<420):
        alpha = 0.3+0.7*(dWave-380)/(420-380)
    elif (dWave>=420) & (dWave<701):
        alpha = 1.0
    elif (dWave>=701) & (dWave<780):
        alpha = 0.3+0.7*(780-dWave)/(780-700)
    else:
        alpha = 0       #非可见区
    return [maxPix*(c*alpha)**gamma for c in rgbs[p]]

绘制光谱

def drawSpec():
    pic = np.zeros([100,360,3])
    rgb = [getRGB(d) for d in range(400,760)]
    pic = pic+rgb
    plt.imshow(pic)
    plt.yticks([])      #隐藏y坐标轴
    plt.xticks(range(0,360,50),['400','450','500','550','600','650','700','750'])
    plt.show()

以上就是Python光学仿真实现波长与颜色之间对应关系示例解析的详细内容,更多关于Python光学仿真波长与颜色对应关系的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python光学仿真学习处理高斯光束分布图像

    目录 通过python处理光斑图像 1 相关包与图像读取 2 图像截取 3显示强度 4数据拟合 问题 通过python处理光斑图像 1 相关包与图像读取 首先需要科学计算必备包numpy和画图包matplotlib.pyplot,我们通过后者进行图像数据的读取. plt.imread读取图片之后为数据格式为numpy数组,可以通过成员函数astype将整型数据变成浮点型,有利于后期处理. plt.imshow将img的数据加载到窗口,plt.show()显示绘图窗口,默认显示为伪彩图. pyth

  • Python光学仿真从Maxwell方程组到波动方程矢量算法理解学习

    Maxwell方程组是十九世纪最伟大的公式,代表了传统物理学人对公式美学的孜孜追求,也影响了无数后来者的物理美学品味. 回顾历史,当1864年,Maxwell发出那篇著名的<电磁场的动力学理论>时,实则列出了二十个公式,以总结前人的物理学成果,我们将分量公式合并为矢量,可以得到八个式子,即 以上符号分别表示 二十年后,Heaviside对这二十个公式进行重新编排,得到了我们熟悉的形式,并将其命名为麦克斯韦方程组: 对上式中左侧两个旋度公式再取旋度,得到 其中, ∇ E = 0,所以可得到波动方

  • Python光学仿真之对光的干涉理解学习

    光的干涉 干涉即两束光在叠加过程中出现的强度周期性变化情况,其最简单的案例即为杨氏双缝干涉. 如图所示,光从 S S S点发出,通过两个狭缝 S 1 , S 2 S_1,S_2 S1​,S2​,最终汇聚在右侧的干涉屏上,在不同位置处将会产生不同的相位差. import numpy as np import matplotlib.pyplot as plt #两束光叠加 waveAdd = lambda I1,I2,theta : I1+I2+2*np.sqrt(I1*I2)*np.cos(the

  • Python光学仿真光的偏振编程理解学习

    目录 光的偏振 光的偏振 由于光波是横波,所以对于任意一个光波,其振幅方向与传播方向在一个固定的平面内.换言之,一束光波可以存在振幅方向不同的一群光波,对于其中一个光波而言,其振幅方向即为偏振方向. 可以画出其示意图 #偏振光演示 import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D as axd def polarShow(): z = np.arange(0,5,0

  • Python基于高斯消元法计算线性方程组示例

    本文实例讲述了Python基于高斯消元法计算线性方程组.分享给大家供大家参考,具体如下: #!/usr/bin/env python # coding=utf-8 # 以上的信息随自己的需要改动吧 def print_matrix( info, m ): # 输出矩阵 i = 0; j = 0; l = len(m) print info for i in range( 0, len( m ) ): for j in range( 0, len( m[i] ) ): if( j == l ):

  • Python光学仿真学习衍射算法初步理解

    对衍射最经典的解释是Huygens-Fresnel原理,Huygens认为波阵面上每一点都会成为新的波源,这些子波源的相互干涉就形成了衍射.这显然是一种离散的观点,仿佛是专门为程序员准备的一样. 假设一束光打在一个方形孔上,这个方形孔被细分成 n×n个网格,那么每个网格都相当于是一个小孔,而这些小孔的互相干涉,即为衍射.随着网格不断被细分,最终可以逼近真实的衍射情形.那么,假设矩孔处为等相位面,其网格坐标为  (i,j),到衍射屏距离为 d d d,那么对于衍射屏上任意一点P(x,y),其光强为

  • Python光学仿真实现波长与颜色之间对应关系示例解析

    目录 光的颜色 python实现为 绘制光谱 光的颜色 与其说颜色是光的一种属性,不如说是人眼对可见光频率范围内的一种感应,是人眼的一种属性.而人眼对光频的感应包括三个方面,即明度.色调和饱和度. 其中, 明度与光强有关 色调反应的是光的频率信息 饱和度表示图像上的颜色与光谱色的接近程度 当不考虑色调.饱和度为0的时候,只考虑明度,则色彩感消失,就是所谓的黑白图像,或者更严格地说是灰度图像. 色调与饱和度虽然反应色光的频率信息,但表现的是人眼对光的反馈特性,与光的频率是不同的物理量.其与光的频率

  • Python光学仿真wxpython之DC绘图

    一般来说,系统与绘图程序之间的信息交换是由图形设备接口(Graphics Device Interface,GDI)实现的,在wxpython中,通过device context(DC)对象来实现GDI的功能. DC对象的创建非常简单,只需引用wx.PaintDC即可,而后则可通过dc来设置画笔dc.SetPen,有了画笔,就可以进行图形绘制了.于是,我们再考虑到图形的属性,包括形状.颜色与边框等,更细致地说,是图形形状.填充颜色.边框类型.边框颜色. 我们可以通过一个矩形的例子来说明: 上面的

  • Python光学仿真教程实现光线追踪

    目录 光线追迹 几何抽象 光线 线段与圆弧 光线追迹 得益于计算机的计算的能力,通过追踪具有代表性的光线的传播轨迹,可以更加精确地描述光学系统的性能,光线追迹方法也因此大展其能,诸如Zemax.tracepro等软件便都提供了相应的功能. 而建立在折射定律基础之上的光线追迹方法,对数学功底要求较低,所以比较适合作为python初学者的入门项目.在接下来的这一章,希望通过对光线追迹的实现,掌握python中的列表.元组.字典.集合等数据类型的基本概念,并且对面向对象与函数式编程有一个基本的了解.

  • Python光学仿真wxpython透镜演示系统框架

    透镜演示系统 框架 现在,我们可以做一个具备友好界面的透镜演示系统了.我们需要两个圆弧来表示透镜,一条线段表示主光轴,多条线段表示光线的传播路径.此外,还需要对光源和透镜的参数进行调节. 然而值得注意的一点是,我们在进行计算和画图过程中所用到的几何图形,在表达形式以及操作流程上可能并不相同.例如,对于光源发出的一条射线,它与透镜的作用流程为 寻找与透镜前表面的交点A 获取反射和透射直线 寻找透射直线与透镜后表面的交点B 计算透过透镜的直线 然而对于画图程序来说,光源S和A之间有一条线段,A和B之

  • python光学仿真实现光线追迹之空间关系

    目录 空间关系 相交判定 射线排序 线弧关系 点弧关系 空间关系 变化始于相遇,所以交点是一切的核心. 相交判定 首先考察一束光线能否打在某个平面镜上.光线被抽象成了一个列表[a,b,c],平面镜则被抽象成为由两个点构成的线段[(x1,y1),(x2,y2)].两条直线的交点问题属于初等数学范畴,需要先将线段转换成直线的形式,然后再求交点.但是两条直线的交点可能落在线段的外面,从而不具有判定的意义. 如果我们的光学系统中有大量的光学元件,那么如果有一种方法可以快速判断光线是否与光学元件有交点,将

  • python光学仿真实现光线追迹折射与反射的实现

    目录 折射与反射 平面反射 平面折射 python实现 弧面问题 折射与反射 光线与光学元件相互作用,无非只有两件事,反射和透射.而就目前看来,我们所常用的光学元件,也无非有两种表面,即平面和球面,二维化之后就简化成了射线与线段,射线与劣弧的关系. 平面反射 无论从哪个角度来看,平面的反射折射都要比球面更简单,而反射问题要比折射问题更简单,所以,我们首先处理平面的反射问题. 反射定律即入射角等于反射角,心念及此,最为循规蹈矩的思路必然是先找到入射光线和平面的夹角,然后用这个夹角和平面(在二维空间

  • python光学仿真相速度和群速度计算理解学习

    目录 波动模型 相速度 群速度 从编程的角度来说,波动光学在某些情况下可以简单地理解为在光线模型的基础上,引入一个相位项. 波动模型 一般来说,三个特征可以确定空间中的波场:频率.振幅和相位,故光波场可表示为: import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D z = np.arange(15,200)*10 #单位为nm x = np.arange(15,200)

  • python光学仿真通过菲涅耳公式实现波动模型

    从物理学的机制出发,波动模型相对于光线模型,显然更加接近光的本质:但是从物理学的发展来说,波动光学旨在解决几何光学无法解决的问题,可谓光线模型的一种升级.从编程的角度来说,波动光学在某些情况下可以简单地理解为在光线模型的基础上,引入一个相位项. 波动模型 一般来说,三个特征可以确定空间中的波场:频率.振幅和相位,故光波场可表示为: import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import

随机推荐