【问题标题】:convert RGB pixel to wavelength将RGB像素转换为波长
【发布时间】:2016-05-30 14:41:07
【问题描述】:

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

为了克服 RGB 值没有单一值的问题,我将使用棱镜来获得光学点阵。这样一来,我就收到了频谱的部署,频谱的差异仅在 X 轴上。

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

【问题讨论】:

  • 这个问题是假的。并非所有由 RGB 表示的“颜色”都是单色的。例如。什么波长是白色的?
  • 光谱范围内没有白色yorku.ca/eye/spectrum.gif
  • @MotiS 在连续光谱中,没有 3 种波长的组合(一种用于红色,一种用于绿色,一种用于蓝色),加起来会为您提供另一个单一波长(除非三分之二的强度为零)。
  • 单一光源(光谱仪)和棱镜不会产生白光。棱镜用于单色光。
  • 棱镜用于得到衍射,结果是光谱

标签: image matlab colors spectrum


【解决方案1】:
  1. 你必须从x位置得到wavelength

    您不能从颜色计算波长,因为两者不是一回事。所以首先你应该用已知的波长校准你的光谱仪。从那个推断函数:

    wavelength = f(x)
    

    通过 LUT 和插值,或通过近似多项式。欲了解更多信息,请参阅:

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

    所以在我这里拍摄/绘制阳光:

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

    正如您所见,我拍摄的太阳光谱或多或少与参考光谱相匹配(差异是由于光栅材料、拜耳滤光片、相机属性、云层和大气等造成的)。弗劳恩霍夫线如何不容易被局部最小值检测到,因此可能是一些用户辅助 GUI 样式将是一个更好的主意。

    但请注意,WEB 上的大多数光谱图像都是错误的、非线性的或偏移的!!! 所以为了确保我从线性化光谱数据 like this 创建了一个参考光谱,这里的结果是 @987654345 @:

    这里的情节:

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

    您的设置应如下所示:

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

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

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

    正如我之前提到的您无法从颜色中获取波长,因为输入光谱的“无限”组合会产生相同的 RGB 响应。例如,采用白色......它可以由 3 个或更多不同的波长甚至连续的白噪声组成。所以从RGB你不能分辨它是哪一个......如果你还加上棱镜/光栅组合的x位置,那么你可以获得波长,但它会比直接从@987654347直接转换要复杂得多,精度也更低@位置...

  2. 根据 RGB 计算强度

    这可能有点棘手,因为您的传感器可能对不同的波长具有不同的灵敏度。您可以将强度归一化,类似于 #1。只需拍摄已知强度的光源并估算丢失的波长即可。这也可以用阳光作为光源来完成

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

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

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

  3. 绘制数据

    x 轴是波长,y 轴是强度。如果你想应用光谱颜色,你可以使用这个:

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

【讨论】:

    【解决方案2】:

    如果我正确理解您想要达到的目标,它是可行的(有点),但需要校准。

    首先您想在 hsv 空间上工作,您可以使用 rgb2hsv 进行此操作

    在 HSV 空间中,“V”或“值”将为您提供给定像素的光强度。这将是您要绘制的值,以便获得您显示的图表。您可以获取每列像素的平均值,也可以只分析中间行,无论哪种方式更适合您。

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

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

    更多关于它here

    但这只能在理想的照明条件下工作,并且如果您的相机足够灵敏并且它的 ccd 具有真正的绿色、红色和蓝色,我不知道如何测试。更不用说您将在显示器中看到的波长还取决于显示器的校准,所以我不会相信它。

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

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


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

    【讨论】:

    • 我很确定 OP 使用的是未经过滤的检测器,即每个像素对所有波长都有响应(尽管效率不同)。这就是光谱仪的工作原理。
    【解决方案3】:

    聚会迟到了。但这里有一个想法,可以准确(接近科学方法)将传感器像素的 RGB 转换为波长图中的强度值。

    1. 获取已知波长的光源。

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

    1. 获取图像传感器中像素的波长效率

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

    1. 在进行光学设置之前使用宽带输入光源,以充分利用光谱

    尽管您尝试实现的目标是完全有效的,但它并不是一个高精度的仪器系统,因此研究人员/行业不使用它。在真正的光谱仪中(主要)使用衍射光栅,光栅上的线之间的距离和入射角用于计算 CCD 传感器(或任何光传感器的线性阵列)上的波长扩展事实)。通常,调整该角度以实现所需的波长扩展而不损失分辨率。这是一个example from Andor,用他们的产品设计一个系统。

    【讨论】:

      【解决方案4】:

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

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

      您是否也简化了替代方案,使用位置来识别波长?将所有东西都设置在固定位置后,您可以计算出每个波长在表面上的最终位置。剩下要做的是建立一些将像素与波长相关联的校准图,一些工作要做,但将所有内容都放在固定设置中,这是您只需要做一次的校准。另一个优势是,一旦您在表面上写下刻度,您就可以轻松记录并验证感应到的数据。

      【讨论】:

      • 是的,但您需要再次校准棱镜。这是一项令人讨厌的工作,因为大多数玻璃类型都具有非线性色散。这就是所有商业光谱仪都使用光栅的原因。
      • @CarlWitthoft 自制光谱仪也使用光栅,因为它很容易获得(由 CD 或 DVD 制成)。要获得棱镜,您通常必须解剖一些光学系统。
      猜你喜欢
      • 2016-08-05
      • 1970-01-01
      • 1970-01-01
      • 2019-10-18
      • 1970-01-01
      • 2019-03-16
      • 2010-12-14
      • 1970-01-01
      • 2021-12-17
      相关资源
      最近更新 更多