我正在尝试将光谱转换为单色。 (如果您对这些值感兴趣,请查看图片 - 第一列是波长,第二列是光谱反射率)。 最好是最终接收 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],这是错误的。
从阅读文档,您可能看到的问题可能与输入比例的差异有关。
默认比例设置为“参考”,它使用特定算法指定的范围。
对于 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]