Этот вопрос требует ответа, который, вероятно, не подходит для формата переполнения стека.
ASTM E308 сам по себе представляет собой сложный стандарт на 50 страниц, основная часть которого посвящена преобразованию спектрального распределения в CIE XYZ. трехцветные значения. Это также касается преобразования в CIE Lab и CIE Luv.
Связанная с вами электронная таблица не полностью реализует ASTM E308, а удобно использует метод интегрирования для интервалов измерения 5 нм без таблицы взвешивания трехстимульных значенийфакторы, которые вам технически необходимы, если спектральные данные скорректированы по полосе пропускания. Это хорошо для практических целей, но если требуется точность, важно знать, что ASTM E308 является очень строгим.
Электронная таблица довольно сложна, потому что она, кажется, использует вычисление Augmented SRM ссобственные векторы для сотни или около того пива.
Предполагая, что вы хотите использовать ASBC метод , процесс должен быть следующим:
- Вычислить спектральное распределение пропускания пива для данной SRM и длины пути, используя следующее уравнение:
![enter image description here](https://i.stack.imgur.com/uqFVd.png)
- Преобразовать спектральное распределение в 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](https://i.stack.imgur.com/KGYQU.png)
Обратите внимание, что Color должен быть простым в работе в контейнере вбэкэнд через Flask и позвонить из Javascript. У нас есть усовершенствованный 3D-визуализатор , который может быть полезен, если вы захотите пойти по этому пути.