我需要识别从光源(光谱仪)发出的光谱。 为此,我需要将每个像素转换为波长。
为了克服RGB值没有单个值的问题,我将使用棱镜,以便获得光学晶格。这样,我就接收了光谱的部署,光谱的差异只是沿着X轴。
我的问题是,如何将像素转换为波长并接收作为波长函数的强度图。
答案 0 :(得分:2)
您必须从wavelength
位置获取x
你不能从颜色计算波长,因为两者不是同一个东西。首先,您应该使用已知波长校准您的光谱仪。从推断功能:
wavelength = f(x)
通过 LUT 和插值,或通过近似多项式。有关详细信息,请参阅:
您可以使用太阳光作为参考,并根据已知光谱(Fraunhofer)线进行校准。首先是example I found on google:
所以拍摄/拍摄我的照片:
交叉匹配Fraunhofer lines(较暗的线条,提防过度指示的图像,他们可以搞砸了,强度是R+G+B
没有重量,我们不希望人类感知像转换)并制作一个已知波长表x图像中的位置。从中插入您的wavelength = f(x)
。
正如你所看到的,太阳光谱的照片或多或少与参考光谱相匹配(差异是由于光栅材料,拜耳滤镜,相机属性,云和大气等等)。有些Fraunhofer线路不容易通过局部最小值检测到,因此可能会有一些用户帮助GUI样式开始时更好。
但请注意,WEB上的大多数光谱图像都是错误的或非线性的或移位的!所以我确保从线性光谱数据like this创建参考光谱,这里的结果400-700 [nm]
:
这里有情节:
灰线是400-700 nm的栅格,步长为10 nm。
以下是您的设置应如下所示:
这是来自我的光谱范围的图像(查看我的LCD上的白色区域):
我正在使用由DVD制成的光栅,因此是圆弧形状。现在,如果您的相机相对于棱镜处于固定位置,那么对于选定的水平线,像素的x位置直接对应于特定波长。
如果你没有看到任何Fraunhofer线,那么你就会在棱镜/光栅之前缺少光圈。我通常使用由薄纸设置的0.1 mm
距离的2个剃刀刀片。如果图像没有聚焦,则需要在相机/传感器之前添加镜头,或者在外部光线下添加更多屏蔽。
正如我前面提到的那样你不能从颜色中获得波长,因为有无限的"输入光谱的组合创建相同的RGB响应。例如,采用白色......它可以由3种或更多种不同的波长组成,甚至是连续的白噪声。所以从RGB你不能分辨它是哪一个...如果你还添加了x位置与棱镜/光栅的组合,那么你可以得到波长,但它会比仅仅{{{}的直接转换更复杂,更精确1}}位置......
从RGB计算强度
这可能有点棘手,因为您的传感器可能对不同波长具有不同的灵敏度。您可以将强度标准化为与#1 类似。只需拍摄已知强度的光源并近似检测缺失的波长。这也可以使用Sunlight作为源
来完成从标准化颜色中,您只需计算灰度强度即可。
为了提高准确度,您可以对同一x
的所有像素进行平均。
为了提高准确度和灵敏度,通常使用非颜色传感器(主要是线性相机),无论是设计还是删除Bayer filter,这样就不会弄乱数据。
绘制数据
x轴上的是波长,y轴上是强度。如果您想应用光谱颜色,可以使用:
注意校准数据可能随温度而变化......
答案 1 :(得分:2)
晚会。但这是一个准确(接近科学方法)的想法,将传感器像素的RGB转换为波长图中的强度值。
发射带宽越窄越好。激光器适用于此类要求,但也要注意功率并确保它不超过图像传感器限制。最好用三种波长(红色,绿色,蓝色)校准测量系统。理想情况下,当使用红色激光时,读出原始图像并查找像素的绿色和蓝色通道上的任何电荷累积。 (因为每个像素都有拜耳滤波器模式)。如果累积太高,可以考虑使用质量好的图像传感器。然后,遵循Noel Segura Meraz建议的HSV方法。对捕获的图像使用垂直分级。只需在传感器阵列中添加列的强度值,就可以进行垂直分级。使用这三种激光器校准系统后,混合并匹配它们以验证插值功能是否正常工作。
如果无法从图像传感器的规格表中获取此信息,则在图像传感器之前的光学设置中引入一个薄的垂直狭缝,从而仅选择特定波长。获取每个波长的所有垂直分级强度值,以表征您的图像传感器。薄的狭缝不应该太薄以至于引入光的衍射效应。 如果图像传感器对于每个波长具有几乎相同的强度值,则它将具有很大的特性。使用此数据来缩放从步骤1获得的波长与强度图。
虽然您要实现的目标是完全有效的,但它并不是一个高度精确的仪器系统,因此研究人员/行业不会使用它。在真正的光谱仪中,使用衍射光栅(主要),光栅上的线之间的距离和入射角用于计算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
)与你的情况无关,它试图重现人类的感知。
如果你真的想要一个准确的运行系统,你需要建立某种校准过程,大多数相机不是很准确,进一步的行为会根据温度等因素而变化,所以你必须重复它。
您是否也使用位置来识别波长?将所有设置都固定在固定位置,您可以在表面上进行数学处理,每个波长都会结束。剩下要做的是建立一些将像素与波长相关联的校准图,一些工作要做,但将所有内容都固定在一个固定的设置中,这是一个校准,你只需做一次。另一个优点是,一旦您在表面上书写了刻度,您就可以轻松获取文档并验证感测数据。