Преобразование RGB-значений одного пространства в RGB-значения другого сводится к следующим шагам:
1. Привести RGB к значениям в диапазоне 0..1
2. Выполнить гамма-преобразование для приведения RGB в линейный вид
3. Выполнить расчет матрицы преобразования из исходного RGB в целевое RGB и преобразовать RGB
4. Выполнить гамма-преобразование для целевого пространства
5. Привести RGB к 8-битному или 16-битному виду
Пункт 3 будет раскрыт подробно ниже. Рассмотрим на примере перевод RGB (169, 240, 135) из пространства Adobe RGB (D65, gamma 2.2) в пространство sRGB (D65, gamma ~2.2).
Откроем Adobe Photoshop, создадим новый документ в пространстве Adobe RGB (1998) и зальем его фон цветом RGB (169, 240, 135), затем выполним команду Edit->Convert to Profile и выберем профиль sRGB IEC61966-2.1 (Intent=Relative Colorimetric, Engine=Adobe (ACE), Use Black Point Compensation=False, Use Dither=False). Возможно, для кого-то будет удивительным, но RGB-значения станут 128, 240, 129.
Рассмотрим детально, что при этом происходит.
1. Перевод из 8-битного значения производится делением каждого канала на 255.
2. Гамма преобразование для Adobe RGB производится возведением каждого канала в степень 2.2.
В MS Exсel для п.1-2 можно использовать функцию =СТЕПЕНЬ(X/255;2,2) или =(X/255)^2.2, где X - это ячейка со значением канала RGB.
3. Расчет матрицы преобразования сводится к следующим шагам:
3.1 Выполнить расчет матрицы преобразования RGB в XYZ
3.2 Если исходное и целевое RGB имеют разные цветовые температуры, выполняем хром-адаптацию к D50
3.3 Выполнить расчет матрицы преобразования из XYZ в целевое RGB
3.4 Аналогично п.4, если исходное и целевое RGB имеют разные цветовые температуры, выполняем хром-адаптацию к D50
Расчет матрицы из RGB в XYZ возможен, если известны координаты основных цветов (primaries) и координаты белой точки. Ниже приведена таблица основных цветовых пространств:
Name | Gamma | Reference White |
Red Primary | Green Primary | Blue Primary | ||||||
---|---|---|---|---|---|---|---|---|---|---|---|
xR | yR | YR | xG | yG | YG | xB | yB | YB | |||
Adobe RGB (1998) | 2.2 | D65 | 0.6400 | 0.3300 | 0.297361 | 0.2100 | 0.7100 | 0.627355 | 0.1500 | 0.0600 | 0.075285 |
Apple RGB | 1.8 | D65 | 0.6250 | 0.3400 | 0.244634 | 0.2800 | 0.5950 | 0.672034 | 0.1550 | 0.0700 | 0.083332 |
Best RGB | 2.2 | D50 | 0.7347 | 0.2653 | 0.228457 | 0.2150 | 0.7750 | 0.737352 | 0.1300 | 0.0350 | 0.034191 |
Beta RGB | 2.2 | D50 | 0.6888 | 0.3112 | 0.303273 | 0.1986 | 0.7551 | 0.663786 | 0.1265 | 0.0352 | 0.032941 |
Bruce RGB | 2.2 | D65 | 0.6400 | 0.3300 | 0.240995 | 0.2800 | 0.6500 | 0.683554 | 0.1500 | 0.0600 | 0.075452 |
CIE RGB | 2.2 | E | 0.7350 | 0.2650 | 0.176204 | 0.2740 | 0.7170 | 0.812985 | 0.1670 | 0.0090 | 0.010811 |
ColorMatch RGB | 1.8 | D50 | 0.6300 | 0.3400 | 0.274884 | 0.2950 | 0.6050 | 0.658132 | 0.1500 | 0.0750 | 0.066985 |
Don RGB 4 | 2.2 | D50 | 0.6960 | 0.3000 | 0.278350 | 0.2150 | 0.7650 | 0.687970 | 0.1300 | 0.0350 | 0.033680 |
ECI RGB v2 | L* | D50 | 0.6700 | 0.3300 | 0.320250 | 0.2100 | 0.7100 | 0.602071 | 0.1400 | 0.0800 | 0.077679 |
Ekta Space PS5 | 2.2 | D50 | 0.6950 | 0.3050 | 0.260629 | 0.2600 | 0.7000 | 0.734946 | 0.1100 | 0.0050 | 0.004425 |
NTSC RGB | 2.2 | C | 0.6700 | 0.3300 | 0.298839 | 0.2100 | 0.7100 | 0.586811 | 0.1400 | 0.0800 | 0.114350 |
PAL/SECAM RGB | 2.2 | D65 | 0.6400 | 0.3300 | 0.222021 | 0.2900 | 0.6000 | 0.706645 | 0.1500 | 0.0600 | 0.071334 |
ProPhoto RGB | 1.8 | D50 | 0.7347 | 0.2653 | 0.288040 | 0.1596 | 0.8404 | 0.711874 | 0.0366 | 0.0001 | 0.000086 |
SMPTE-C RGB | 2.2 | D65 | 0.6300 | 0.3400 | 0.212395 | 0.3100 | 0.5950 | 0.701049 | 0.1550 | 0.0700 | 0.086556 |
sRGB | ≈2.2 | D65 | 0.6400 | 0.3300 | 0.212656 | 0.3000 | 0.6000 | 0.715158 | 0.1500 | 0.0600 | 0.072186 |
Wide Gamut RGB | 2.2 | D50 | 0.7350 | 0.2650 | 0.258187 | 0.1150 | 0.8260 | 0.724938 | 0.1570 | 0.0180 | 0.016875 |
Координаты белых точек:
Illuminant | Xw | Yw | Zw |
A | 1.09850 | 1.00000 | 0.35585 |
B | 0.99072 | 1.00000 | 0.85223 |
C | 0.98074 | 1.00000 | 1.18232 |
D50 | 0.96422 | 1.00000 | 0.82521 |
D55 | 0.95682 | 1.00000 | 0.92149 |
D65 | 0.95047 | 1.00000 | 1.08883 |
D75 | 0.94972 | 1.00000 | 1.22638 |
E | 1.00000 | 1.00000 | 1.00000 |
F2 | 0.99186 | 1.00000 | 0.67393 |
F7 | 0.95041 | 1.00000 | 1.08747 |
F11 | 1.00962 | 1.00000 | 0.64350 |
3.1.1 Расчитывается матрица M':
xR/yR | xG/yG | xB/yB |
1 | 1 | 1 |
(1-xR-yR)/yR | (1-xG-yG)/yG | (1-xB-yB)/yB |
3.1.2 Матрица M' инвертируется (см. обратная матрица) и умножается на точку белого
(Sr,Sg,Sb) = invert(M') * (Xw,Yw,Zw)
В MS Exсel используются функции МОБР и МУМНОЖ. (Sr,Sg,Sb) и (Xw,Yw,Zw) располагаются в одну колонку (значение канала в отдельной строке).
3.1.3 Расчитывается матрица M: элементы матрицы M' умножаются построчно на элементы (Sr,Sg,Sb)
Sr*(xR/yR) | Sg*(xG/yG) | Sb*(xB/yB) |
Sr | Sg | Sb |
Sr*((1-xR-yR)/yR) | Sg*((1-xG-yG)/yG) | Sb*((1-xB-yB)/yB) |
Для AdobeRGB->XYZ расчеты в Excel выглядят так:
3.3 Расчитывается матрица XYZ->sRGB. Чтобы её получить необходимо выполнить те же действия, только с primaries для sRGB, а полученную матрицу sRGB->XYZ инвертировать:
На сайте Брюса Линдблума приведена следующая схема расчета матриц для преобразования из RGB в XYZ (возможно, более понятная, чем вышеописанный алгоритм):
Итоговая матрица AdobeRGB->sRGB получается перемножением матриц XYZ->sRGB и AdobeRGB->XYZ.
Линейные значения Adobe RGB (169, 240, 135) в диапазоне 0..1 = (0.404540823, 0.875137582, 0.24680042). Перемножив полученную матрицу AdobeRGB->sRGB получим линейные значения sRGB = (0.217110065, 0.875137582, 0.21982069). Здесь нужно выполнить нормализацию данных: любые отрицательные значения заменить на 0, а все, что больше 1 заменить единицей. То есть происходит обрезание всего, что выходит за охват пространства sRGB, что соответствует режиму Relative Colorimetric.
4. Гамма-коррекция в sRGB выполняется не через возведение в степень 1/2.2, а через следующее условие (ф-ция Excel):
=ЕСЛИ(X<=(0,04045/12,92);X*12,92;1,055*СТЕПЕНЬ(X;1/2,4)-0,055)
5. Умножив полученные значения на 255 мы получим итоговые значения sRGB = (128.342, 240.4574, 129.0799). Отбросив дробные части, мы получаем те же значения, что посчитал нам выше старый добрый Photoshop.
Мы не рассмотрели вопрос хром-адаптации. У Брюса Линдблума есть схема:
В Photoshop используется метод по Брэдфорду и соответственно MA принимается равной:
0,8951
|
0,2664
|
-0,1614
|
-0,7502
|
1,7135
|
0,0367
|
0,0389
|
-0,0685
|
1,0296
|
Если что-то осталось непонятным и/или интересно поразбираться со всей этой математикой в Excel, здесь можно скачать архив с файлом xlsx, в котором я экспериментировал и делал расчеты.