首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用E-308算法将SRM转换为L*a*b*?

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

Stack Overflow用户
提问于 2019-11-06 03:15:56
回答 1查看 340关注 0票数 1

我正试着把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*值。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-06 10:42:21

这是一个确实值得回答的问题,它可能不适合堆栈溢出格式。

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

您所链接的电子表格没有完全实现ASTM E308,并且方便地使用5nm测量间隔的集成方法,而没有一个三刺激值加权因子表,如果光谱数据被带通校正,技术上需要该表。这是很好的实际用途,但如果需要精确,重要的是要知道ASTM E308是非常严格的。

电子表格是相当复杂的,因为它似乎使用增广SRM计算与特征向量的百多啤酒。

假设您想使用ASBC法,这个过程应该如下所示:

  • 使用以下方程计算给定SRM和路径长度的beer传输谱分布:

  • 利用CIE 1964 10度标准观察者和照明器C的积分方法将光谱分布转换为CIE XYZ三刺激值
  • 将CIE XYZ三刺激值转换为CIE实验室
  • 为了更进一步,还可以将它们转换为sRGB
  • 喝啤酒:)

如果您不介意阅读Python,我编写了一个Colab笔记本,它使用颜色并计算SRM和路径长度的网格的啤酒颜色:

代码语言:javascript
复制
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调用它应该很简单。我们有一个高级三维可视化器,如果你想走这条路的话,它会很有帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58722583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档