我正在努力将如何将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)中提到的电子表格对我来说意义不大。帖子说要根据电子表格中的观察者角度选择XYZ向量。如果我选择10度观察角,那么我希望XYZ向量应该是:(82.82,3.48,61.86)。它是否正确?

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

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

最佳答案

这是一个确实可以确保不适合堆栈溢出格式的答案的问题。

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

您链接的电子表格不能完全实现ASTM E308,并且可以方便地在5 nm测量间隔内使用积分方法,而无需三光谱加权因子表,如果光谱数据已通过带通校正,则该表是您在技术上需要的。出于实际目的很好,但是如果需要精度,则必须知道ASTM E308非常严格。

电子表格非常复杂,因为它似乎使用了Augmented SRM
用特征向量计算约100种啤酒。

假设您要使用ASBC method,该过程应如下所示:


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


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


使用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);


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

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

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

10-09 07:05