我正试着把ASTM E-308应用于啤酒的SRM测量。我工作的问题领域要求我们首先通过向L_a_b*的转换,将SRM转换为RGB (或L_a_b*)。似乎我用来创建啤酒配方的每个网站都有他们自己的转换,从SRM到RGB,这是有意义的,因为这是一个棘手的问题。尽管如此,我还是想编写一个开源的js库来处理这个问题。
基本上,我使用的算法如下所述:https://www.homebrewtalk.com/forum/threads/on-the-calculation-of-srm-rgb-values-in-the-srgb-color-space.413581/#post-5232912
我认为这是对E-308算法的简化。我遇到困难的地方是,那篇文章(文章/MOAWorkbook.xls)中提到的电子表格对我来说毫无意义。文章说要根据电子表格中的观察者角度选择XYZ矢量。如果选择一个10度的观测器角,那么XYZ矢量应该是:(82.82,3.48,61.86)。这是正确的吗?
现在,选择光源光谱也有点令人困惑。如果我想要C光源(我认为它是6774 K),我应该从电子表格中提取什么值作为光谱的组成部分?此外,如何计算这些组件?
我在色彩理论上有一些有限的背景,但我真正想要的是能够有一些输入标准,比如,观察角和光源色温,以及SRM值,并计算一个L_a_b*值。
发布于 2019-11-06 10:42:21
这是一个确实值得回答的问题,它可能不适合堆栈溢出格式。
ASTM E308本身是一个50页的复杂标准,其主体是从光谱分布转换为CIE三刺激值。它还涉及到CIE实验室和CIE Luv的转换。
您所链接的电子表格没有完全实现ASTM E308,并且方便地使用5nm测量间隔的集成方法,而没有一个三刺激值加权因子表,如果光谱数据被带通校正,技术上需要该表。这是很好的实际用途,但如果需要精确,重要的是要知道ASTM E308是非常严格的。
电子表格是相当复杂的,因为它似乎使用增广SRM计算与特征向量的百多啤酒。
假设您想使用ASBC法,这个过程应该如下所示:

如果您不介意阅读Python,我编写了一个Colab笔记本,它使用颜色并计算SRM和路径长度的网格的啤酒颜色:
import colour
import colour.plotting
import numpy as np
colour.utilities.describe_environment()
colour.plotting.colour_style()
ASBC_SHAPE = colour.SpectralShape(380, 780, 5)
OBSERVER = colour.CMFS['CIE 1964 10 Degree Standard Observer']
ILLUMINANT = colour.ILLUMINANTS_SDS['C']
ILLUMINANT_XY = colour.ILLUMINANTS['CIE 1931 2 Degree Standard Observer']['C']
def beer_transmission_sd(SRM, path=1, shape=ASBC_SHAPE):
e = np.exp(1)
wl = shape.range()
values = np.exp(
-(SRM / 12.7) * (0.018747 * e**(-(wl - 430) / 13.374) + 0.98226 * e**
(-(wl - 430) / 80.514)) * path)
return colour.SpectralDistribution(
values, wl, name='Beer - SRM {0} - Path {1}'.format(SRM, path))
PATHS = np.linspace(10, 1, 10)
SRM = np.linspace(1, 50, 50)
XYZ = []
for i in PATHS:
for j in SRM:
XYZ.append(
colour.sd_to_XYZ(
beer_transmission_sd(i, j),
cmfs=OBSERVER,
illuminant=ILLUMINANT) / 100.0)
# The Lab values for CIE Illuminant C are computed here:
Lab = colour.XYZ_to_Lab(XYZ, ILLUMINANT_XY)
# But we will be going further :)
RGB = colour.XYZ_to_sRGB(XYZ, illuminant=ILLUMINANT_XY)
figure, axes = colour.plotting.plot_multi_colour_swatches(
[colour.plotting.ColourSwatch(RGB=np.clip(i, 0, 1)) for i in RGB],
columns=len(SRM),
**{
'standalone': False,
'x_label': 'SRM',
'y_label': 'Path (cm)',
'xtick.bottom': True,
'ytick.left': True,
})
# Ugly ticks massaging that will not be needed in future versions.
axes.set_xticks(SRM)
axes.set_yticks(-PATHS + 2)
axes.set_yticklabels(reversed(PATHS))
colour.plotting.render(standalone=True);

注意,让Colour通过烧瓶在后端的容器中运行,并从Javascript调用它应该很简单。我们有一个高级三维可视化器,如果你想走这条路的话,它会很有帮助。
https://stackoverflow.com/questions/58722583
复制相似问题