将RGB像素转换为波长

时间:2016-02-18 12:20:52

标签: image matlab colors spectrum

我需要识别从光源(光谱仪)发出的光谱。 为此,我需要将每个像素转换为波长。

为了克服RGB值没有单个值的问题,我将使用棱镜,以便获得光学晶格。这样,我就接收了光谱的部署,光谱的差异只是沿着X轴。

我的问题是,如何将像素转换为波长并接收作为波长函数的强度图。

example

4 个答案:

答案 0 :(得分:2)

  1. 您必须从wavelength位置获取x

    你不能从颜色计算波长,因为两者不是同一个东西。首先,您应该使用已知波长校准您的光谱仪。从推断功能:

    wavelength = f(x)
    

    通过 LUT 和插值,或通过近似多项式。有关详细信息,请参阅:

    您可以使用太阳光作为参考,并根据已知光谱(Fraunhofer)线进行校准。首先是example I found on google

    Sun reference

    所以拍摄/拍摄我的照片:

    My shot of Sun

    交叉匹配Fraunhofer lines(较暗的线条,提防过度指示的图像,他们可以搞砸了,强度是R+G+B没有重量,我们不希望人类感知像转换)并制作一个已知波长表x图像中的位置。从中插入您的wavelength = f(x)

    正如你所看到的,太阳光谱的照片或多或少与参考光谱相匹配(差异是由于光栅材料,拜耳滤镜,相机属性,云和大气等等)。有些Fraunhofer线路不容易通过局部最小值检测到,因此可能会有一些用户帮助GUI样式开始时更好。

    但请注意,WEB上的大多数光谱图像都是错误的或非线性的或移位的!所以我确保从线性光谱数据like this创建参考光谱,这里的结果400-700 [nm]

    real linearized unshifted sunlight spectra

    这里有情节:

    plot for real data

    灰线是400-700 nm的栅格,步长为10 nm。

    以下是您的设置应如下所示:

    spectro-meter

    这是来自我的光谱范围的图像(查看我的LCD上的白色区域):

    White on my LCD

    我正在使用由DVD制成的光栅,因此是圆弧形状。现在,如果您的相机相对于棱镜处于固定位置,那么对于选定的水平线,像素的x位置直接对应于特定波长。

    如果你没有看到任何Fraunhofer线,那么你就会在棱镜/光栅之前缺少光圈。我通常使用由薄纸设置的0.1 mm距离的2个剃刀刀片。如果图像没有聚焦,则需要在相机/传感器之前添加镜头,或者在外部光线下添加更多屏蔽。

    正如我前面提到的那样你不能从颜色中获得波长,因为有无限的"输入光谱的组合创建相同的RGB响应。例如,采用白色......它可以由3种或更多种不同的波长组成,甚至是连续的白噪声。所以从RGB你不能分辨它是哪一个...如果你还添加了x位置与棱镜/光栅的组合,那么你可以得到波长,但它会比仅仅{{{}的直接转换更复杂,更精确1}}位置......

  2. 从RGB计算强度

    这可能有点棘手,因为您的传感器可能对不同波长具有不同的灵敏度。您可以将强度标准化为与#1 类似。只需拍摄已知强度的光源并近似检测缺失的波长。这也可以使用Sunlight作为源

    来完成

    从标准化颜色中,您只需计算灰度强度即可。

    为了提高准确度,您可以对同一x的所有像素进行平均。

    为了提高准确度和灵敏度,通常使用非颜色传感器(主要是线性相机),无论是设计还是删除Bayer filter,这样就不会弄乱数据。

  3. 绘制数据

    x轴上的

    是波长,y轴上是强度。如果您想应用光谱颜色,可以使用:

  4. 注意校准数据可能随温度而变化......

答案 1 :(得分:2)

晚会。但这是一个准确(接近科学方法)的想法,将传感器像素的RGB转换为波长图中的强度值。

  1. 获取已知波长的光源。
  2. 发射带宽越窄越好。激光器适用于此类要求,但也要注意功率并确保它不超过图像传感器限制。最好用三种波长(红色,绿色,蓝色)校准测量系统。理想情况下,当使用红色激光时,读出原始图像并查找像素的绿色和蓝色通道上的任何电荷累积。 (因为每个像素都有拜耳滤波器模式)。如果累积太高,可以考虑使用质量好的图像传感器。然后,遵循Noel Segura Meraz建议的HSV方法。对捕获的图像使用垂直分级。只需在传感器阵列中添加列的强度值,就可以进行垂直分级。使用这三种激光器校准系统后,混合并匹配它们以验证插值功能是否正常工作。

    1. 获取图像传感器中像素的波长效率
    2. 如果无法从图像传感器的规格表中获取此信息,则在图像传感器之前的光学设置中引入一个薄的垂直狭缝,从而仅选择特定波长。获取每个波长的所有垂直分级强度值,以表征您的图像传感器。薄的狭缝不应该太薄以至于引入光的衍射效应。 如果图像传感器对于每个波长具有几乎相同的强度值,则它将具有很大的特性。使用此数据来缩放从步骤1获得的波长与强度图。

      1. 在光学设置之前使用宽带输入光源以充分利用光谱
      2. 虽然您要实现的目标是完全有效的,但它并不是一个高度精确的仪器系统,因此研究人员/行业不会使用它。在真正的光谱仪中,使用衍射光栅(主要),光栅上的线之间的距离和入射角用于计算CCD传感器(或任何线性阵列的光传感器)上的波长的扩展。事实)。通常,调整该角度以实现所需的波长扩展而不损失分辨率。这是一个example from Andor来设计一个系统及其产品。

答案 2 :(得分:1)

如果我理解你想要达到的目标,那就是可行的(有点),但需要校准。

首先,您希望使用hsv空间,可以使用rgb2hsv

执行此操作

在HSV空间,' V'或者'价值'会给你一个给定像素的光强度。这将是您想要绘制的值,以便获得您显示的图形。您可以获得每列像素的平均值,或者只分析中心行,无论哪种方式对你更有效。

现在,有趣的部分。如何获取图形的x轴值。从理论上讲,你的棱镜会将光线分成特定的波长,每一个都有一个独特的“H”光。或者'色调'价值,由

相关
Hue = (650 - wavelength)*240/(650-475)

有关它的更多信息here

但是这只适用于理想的照明条件,如果你的相机足够灵敏,而且它的ccd有真正的绿色,红色和蓝色,我不知道如何测试。更不用说您将在显示器中看到的波长也取决于显示器的校准,因此我不相信它。

您可以通过' S'的值来检查每个像素的纯度和理想程度。或者'饱和度'越高越好。

我建议您做什么,手动校准。查看您的光谱并用铅笔或其他颜色标记您知道其波长的标记,然后使用这些标记来定义图形的x轴。

我忘了提一下,你只需要进行一次校准,一旦你知道哪个波长与你的相机中的色调有关,你就可以自动进行设置,甚至可以scatter(hue_wavelenght,value)所有像素都可以工作

答案 3 :(得分:0)

我会开始尝试反转this code,这与你想要的完全相反。最后的东西(% LET THE INTENSITY SSS FALL OFF NEAR THE VISION LIMITS)与你的情况无关,它试图重现人类的感知。

如果你真的想要一个准确的运行系统,你需要建立某种校准过程,大多数相机不是很准确,进一步的行为会根据温度等因素而变化,所以你必须重复它。

您是否也使用位置来识别波长?将所有设置都固定在固定位置,您可以在表面上进行数学处理,每个波长都会结束。剩下要做的是建立一些将像素与波长相关联的校准图,一些工作要做,但将所有内容都固定在一个固定的设置中,这是一个校准,你只需做一次。另一个优点是,一旦您在表面上书写了刻度,您就可以轻松获取文档并验证感测数据。