将光谱转换为颜色(Python)

问题描述 投票:0回答:1

Data

我正在尝试将光谱转换为单色。 (如果您对这些值感兴趣,请查看图片 - 第一列是波长,第二列是光谱反射率)。 最好是最终接收 LAB 值,但我也可以轻松地将 RGB 值转换为 LAB。

我尝试用Python的颜色围兜解决问题,但找不到“正确”的方法。

我在互联网上找到的代码都提到了三刺激值,但我只有反射率值的数据,所以我认为这行不通。我也尝试使用一个代码,但我得到的颜色不是我期望的颜色。

最后我问了 Chat GPT(是的,我知道,但我真的很绝望),但他的代码不起作用/给了我错误的值。

以前有人尝试过吗?我很乐意得到任何建议。你可能已经注意到我的 Python 技能相当差:)

import numpy as np
from colour import SpectralDistribution, XYZ_to_Lab, sd_to_XYZ

输入给定数据

    wavelengths = np.array([values])
    reflectance = np.array([values])

根据光谱数据计算三刺激值

    sd = SpectralDistribution(reflectance, wavelengths)
    xyz = sd_to_XYZ(sd)

将 XYZ 值转换为 LAB

    lab = XYZ_to_Lab(xyz)

打印结果 LAB 值

    The resulting LAB values:

结果是 [ 117.20396809 197.12511118 201.43351171],这是错误的。

python colors spectrum
1个回答
0
投票

阅读文档,您可能看到的问题可能与输入比例的差异有关。

默认比例设置为“参考”,它使用特定算法指定的范围。

对于 sd_to_XYZ,输出值在

[0, 100]
范围内。但是,XYZ_to_Lab 算法期望 XYZ 输入值在
[0, 1]
的范围内。

通过将 XYZ 结果除以 100,实验室输出似乎在有效范围内,尽管我不是色彩科学专家,但无法进一步验证此结果是否正确。

import numpy as np
from colour import SpectralDistribution, XYZ_to_Lab, sd_to_XYZ

reflectance = [
   # ...
]
wavelengths = [
   #...
]

sd = SpectralDistribution(reflectance, wavelengths)
xyz = sd_to_XYZ(sd)
lab = XYZ_to_Lab(xyz/100)
print(lab) # [ 12.69792497  42.46931778  21.88655113]

或者您也可以设置域范围比例:

import numpy as np
from colour import SpectralDistribution, XYZ_to_Lab, sd_to_XYZ, set_domain_range_scale

reflectance = [
   # ...
]
wavelengths = [
   #...
]

set_domain_range_scale('1') # All algorithms now accept normalized values
sd = SpectralDistribution(reflectance, wavelengths)
xyz = sd_to_XYZ(sd)
lab = XYZ_to_Lab(xyz)
actual_lab = lab*100 # Convert from [0,1] range to [0,100] actual Lab values
print(lab) # [ 12.69792497  42.46931778  21.88655113]
© www.soinside.com 2019 - 2024. All rights reserved.