gpt4 book ai didi

javascript - 如何使用 E-308 作为算法将 SRM 转换为 L*a*b*?

转载 作者:行者123 更新时间:2023-11-30 19:08:45 24 4
gpt4 key购买 nike

我正在努力思考如何将 ASTM E-308 应用于啤酒的 SRM 测量。我工作的问题领域要求我们首先通过转换为 Lab* 从 SRM 到 RGB(或 sRGB)进行适当的转换。似乎我用来创建啤酒配方的每个网站都有自己的从 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 算法的简化。我遇到困难的地方是该帖子 (http://wetnewf.org/pdfs/Brewing_articles/MOAWorkbook.xls) 中提到的电子表格对我来说意义不大。该帖子说要根据电子表格中的观察者 Angular 选择 XYZ 向量。如果我选择 10 度观察者 Angular ,那么我希望 XYZ 向量应该是:(82.82, 3.48, 61.86)。这是正确的吗?

现在,选择光源光谱也有些困惑。如果我想要光源 C(我认为是 6774K),我应该从该电子表格中提取哪些值以添加为光谱的组成部分?此外,如何计算这些组件?

我在色彩理论方面的背景知识有限,但我真正想要的是能够拥有一些输入标准,例如观察者 Angular 和光源色温,以及 SRM 值,并计算 L ab* 值。

最佳答案

这个问题确实需要一个可能不适合 Stack Overflow 格式的答案。

ASTM E308 本身是一个 50 页的复杂标准,其主体是关于从光谱分布到 CIE XYZ 三刺激值的转换。它还涉及到 CIE Lab 和 CIE Luv 的转换。

您链接的电子表格没有完全实现 ASTM E308,并且方便地使用积分方法进行 5 nm 测量间隔,而没有三色加权因子表,如果光谱数据经过带通校正,您在技术上需要这种表。这对于实际用途来说很好,但如果需要精度,了解 ASTM E308 非常严格是很重要的。

电子表格相当复杂,因为它似乎使用了 Augmented SRM用特征向量计算一百种左右的啤酒。

假设您要使用 ASBC method ,流程应该是这样的:

  • 使用以下等式计算给定 SRM 和路径长度的啤酒传输光谱分布:

enter image description here

  • 使用 CIE 1964 10 度标准观察者和光源 C 的积分方法将光谱分布转换为 CIE XYZ 三刺激值
  • 将 CIE XYZ 三刺激值转换为 CIE Lab
  • 更进一步,将它们也转换为 sRGB
  • 喝啤酒:)

如果你不介意阅读 Python,我做了一个 Colab notebook使用 Colour并为 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);

Beer Colour

请注意,通过 Flask 在后端的容器中运行 Color 并从 Javascript 调用它应该很简单。我们有一个 advanced 3D visualiser如果您想走那条路,这可能会有所帮助。

关于javascript - 如何使用 E-308 作为算法将 SRM 转换为 L*a*b*?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58722583/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com