Как мне преобразовать SRM в L * a * b *, используя E-308 в качестве алгоритма? - PullRequest
1 голос
/ 06 ноября 2019

Я пытаюсь обернуть голову, как применить ASTM E-308 к измерениям SRM для пива. Проблемная область, в которой я работаю, требует, чтобы у нас было приличное преобразование из SRM в RGB (или sRGB) путем преобразования сначала в 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. У меня возникли трудности с тем, что электронная таблица, упомянутая в этом посте (http://wetnewf.org/pdfs/Brewing_articles/MOAWorkbook.xls), не имеет для меня большого смысла. В посте говорится, что нужно выбрать вектор XYZ на основе угла наблюдения из электронной таблицы. ЕслиЯ выбираю угол наблюдения 10 градусов, тогда я ожидал бы, что вектор XYZ должен быть: (82,82, 3,48, 61,86). Это правильно?

Теперь выбор спектра источника света также несколько сбивает с толку. Если яхотите источник света C (который я считаю 6774K), какие значения я извлекаю из этой таблицы, чтобы добавить в качестве компонентов для спектра? Кроме того, как я могу рассчитать эти компоненты?

У меня ограниченный цвет фонатеория, но мне бы очень хотелось, чтобы у меня был какой-то набор входных критериев, скажем, угол наблюдения и цветовая температура источника света, а также значение SRM и вычисление значения L a b *.

1 Ответ

1 голос
/ 06 ноября 2019

Этот вопрос требует ответа, который, вероятно, не подходит для формата переполнения стека.

ASTM E308 сам по себе представляет собой сложный стандарт на 50 страниц, основная часть которого посвящена преобразованию спектрального распределения в CIE XYZ. трехцветные значения. Это также касается преобразования в CIE Lab и CIE Luv.

Связанная с вами электронная таблица не полностью реализует ASTM E308, а удобно использует метод интегрирования для интервалов измерения 5 нм без таблицы взвешивания трехстимульных значенийфакторы, которые вам технически необходимы, если спектральные данные скорректированы по полосе пропускания. Это хорошо для практических целей, но если требуется точность, важно знать, что ASTM E308 является очень строгим.

Электронная таблица довольно сложна, потому что она, кажется, использует вычисление Augmented SRM ссобственные векторы для сотни или около того пива.

Предполагая, что вы хотите использовать ASBC метод , процесс должен быть следующим:

  • Вычислить спектральное распределение пропускания пива для данной SRM и длины пути, используя следующее уравнение:

enter image description here

  • Преобразовать спектральное распределение в CIEТристимулусные значения XYZ с использованием метода интегрирования для 10-градусного стандартного наблюдателя и источника света CIE 1964 C
  • Преобразование трехцветных значений CIE XYZ в CIE Lab
  • Для дальнейшего преобразования также преобразуйте их в sRGB
  • Пейте пиво:)

Если вы не против читать Python, я сделал ноутбук Colab , в котором используются Color и компьютерПроверьте цвет пива для сетки 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

Обратите внимание, что Color должен быть простым в работе в контейнере вбэкэнд через Flask и позвонить из Javascript. У нас есть усовершенствованный 3D-визуализатор , который может быть полезен, если вы захотите пойти по этому пути.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...