Математическое преобразование sRGB и AdobeRGB

Это очень понятный вопрос, но я провел много исследований и не нашел ответа. Вопрос StackOverflow как this или этот посвящен преобразованию jpeg. Это о встроенной библиотеке python.

Итак, как конвертировать sRGB в AdobeRGB и наоборот??? Я имею в виду математическую функцию, которая преобразует 3 байта в 3 байта. Нет jpges и т.д. Просто математическая функция для преобразования цветов с помощью пера и бумаги.

Да, фотошоп делает это на самом деле, и есть некоторые странные онлайн-калькуляторы, которые показывают другой результат.

Почему я не могу найти простую формулу в Google?

Мне нужно подумать, что я ничего не знаю и нет прямого ответа на мой вопрос.

Буду очень признателен, если кто-то может описать, что происходит или давать формулу.

UPDATE

Большой массив результатов для целочисленных rgbs также будет правильным ответом.

Ответ 1

Вот код Python для реализации формул. Как отмечено в комментариях, вы конвертируете из одного цветового пространства в XYZ (нормализованное), а затем из XYZ в новое цветовое пространство. Я не на 100% доволен точностью этих функций, но он должен попасть в стадион. Когда я придумаю уточнения, я отредактирую их в ответ.

def linear_sRGB(c):
    if c <= 0.04045:
        return c / 12.92
    else:
        return pow((c + 0.055) / 1.055, 2.4)

def sRGB_to_XYZn(r, g, b):
    Rlin = linear_sRGB(r / 255.0)
    Glin = linear_sRGB(g / 255.0)
    Blin = linear_sRGB(b / 255.0)
    Xn = Rlin * 0.4124 + Glin * 0.3576 + Blin * 0.1805
    Yn = Rlin * 0.2126 + Glin * 0.7152 + Blin * 0.0722
    Zn = Rlin * 0.0193 + Glin * 0.1192 + Blin * 0.9505
    return Xn, Yn, Zn

def gamma_sRGB(c):
    if c <= 0.0031308:
        return 12.92 * c
    else:
        return 1.055 * pow(c, 1/2.4) - 0.055

def XYZn_to_sRGB(Xn, Yn, Zn):
    Rlin = Xn * 3.2406255 + Yn *-1.5372080 + Zn *-0.4986286
    Glin = Xn *-0.9689307 + Yn * 1.8757561 + Zn * 0.0415175
    Blin = Xn * 0.0557101 + Yn *-0.2040211 + Zn * 1.0569959
    R = round(255 * gamma_sRGB(Rlin))
    G = round(255 * gamma_sRGB(Glin))
    B = round(255 * gamma_sRGB(Blin))
    return R, G, B

def linear_AdobeRGB(c):
    if c <= 0.0:
        return 0.0
    return pow(c, 2.19921875)

def AdobeRGB_to_XYZn(R, G, B):
    Rlin = linear_AdobeRGB(R / 255.0)
    Glin = linear_AdobeRGB(G / 255.0)
    Blin = linear_AdobeRGB(B / 255.0)
    Xn = Rlin * 0.57667 + Glin * 0.18556 + Blin * 0.18823
    Yn = Rlin * 0.29734 + Glin * 0.62736 + Blin * 0.07529
    Zn = Rlin * 0.02703 + Glin * 0.07069 + Blin * 0.99134
    return Xn, Yn, Zn

def gamma_AdobeRGB(c):
    if c <= 0.0:
        return 0.0
    return pow(c, 1/2.19921875)

def XYZn_to_AdobeRGB(Xn, Yn, Zn):
    Rlin = Xn * 2.04159 + Yn *-0.56501 + Zn *-0.34473
    Glin = Xn *-0.96924 + Yn * 1.87597 + Zn * 0.04156
    Blin = Xn * 0.01344 + Yn *-0.11836 + Zn * 1.01517
    R = round(255 * gamma_AdobeRGB(Rlin))
    G = round(255 * gamma_AdobeRGB(Glin))
    B = round(255 * gamma_AdobeRGB(Blin))
    return R, G, B

Ответ 2

Это немного сложные, поэтому, пожалуйста, прочитайте спецификации, если вам нужны формулы.

sRGB (PDF)
https://www.w3.org/Graphics/Color/srgb
Adobe RGB (октябрь 2002 года) (PDF)
http://www.color.org/adobergb.pdf
Adobe RGB (1998) (PDF)
https://www.adobe.com/digitalimag/pdfs/AdobeRGB1998.pdf

Wiki также хороша.
SRGB
https://en.wikipedia.org/wiki/SRGB_color_space
Adobe RGB
https://en.wikipedia.org/wiki/Adobe_RGB_color_space


Для тестирования проверьте настройки преобразования цвета.
Может произойти преобразование программного обеспечения.
(в основном, если вне диапазона, но в некоторых настройках, а также вне диапазона значений).

ех. Настройки цвета Photoshop
http://help.adobe.com/en_US/creativesuite/cs/using/WS6A727430-9717-42df-B578-C0AC705C54F0.html#WS6078C298-CB20-4dc8-ACD4-D344110AA026

Об рендеринге намерений
Перцептивная
Стремятся сохранить визуальную связь между цветами... хотя сами значения цвета могут измениться.

Связанные данные
http://www.color-management-guide.com/conversion-mode-perceptual-relative-colorimetric-rendering-intent.html


Использование XYZ более гибко относительно преобразования в другие цветовые пространства, чем прямое (между sRGB и Adobe RGB) преобразованием.

Цветовое пространство RGB
https://en.wikipedia.org/wiki/RGB_color_space


Преобразование между sRGB и XYZ содержит нелинейную операцию.
Таким образом, прямое преобразование между sRGB и Adobe RGB затруднено.

См. Спецификацию раздела преобразования в wiki sRGB. (Часть обратного преобразования.)

из спецификации

Если R, G, B меньше или равно 0.04045
RL = R/12,92
...
Если R, G, B больше 0.04045
RL = ((R + 0,055)/1,055) 2,4 2,4...

RL для линейного (XYZ (D65)), R для sRGB в этой формуле.
Зеленые и синие также имеют одинаковые формулы.


Не препятствует прямому преобразованию между другими цветовыми пространствами, но, конверсия между Adobe RGB и XYZ также содержит нелинейные операции. (Округление до int.)

Точнее, это Adobe RGB (в значениях float) для преобразования Adobe RGB (в значениях int).


NB: Предполагаемые белые точки для них разные.
(поскольку цель другая. sRGB для отображения, Adobe RGB для фотографий.)
И матрица преобразования в спецификациях для D65 (sRGB) и D50 или D65 (Adobe RGB).

Мы должны думать о 3 вещах.
RGB, диапазон значений (и правильность цвета) дисплея и среды просмотра.

Ex.
1.Конверсионная матрица (и другие формулы): значение RGB
2. Отображение белой и черной точки: диапазон значений дисплея
3. Цветность освещения освещения: среда просмотра

Только 1 (матрица и формулы) имеет эффекты при преобразовании значений,
но 2 и 3 также важны, потому что они решают, как мы можем видеть значения RGB.
NB: с профилем ICC, если 2 (настройки дисплея) сохранены, он рассчитывает.

Если диапазон отображения узкий, чем может представлять значение RGB, они будут обрезаны (пока отображаются).
Если диапазон неправильный, белый или черный могут быть серыми и т.д.

Если цветность окружающего освещения отличается от одной матрицы преобразования и для нее предназначены формулы, мы увидим разные цвета.


Конверсионная матрица
(Это важно, поскольку это влияет на значения RGB.)

из sRGB (Отображение матрицы преобразования для D65.)

  1. Преобразование из XYZ (D65) в линейные значения sRGB

В спецификации Adobe RGB (1998) существуют два типа матриц преобразования (и формулы).
4.3.1 ~ (без ICC): D65
4.3.6 ~ (с ICC): D50

от Adobe RGB (1998)
(для изображений с профилем ICC и т.д.)

4.3.6 Кодирование значений ICC PCS версии 2 в 24-битном Adobe RGB (1998)
4.3.6.1 Преобразование значений XYZ в RGB тристимула

ПРИМЕЧАНИЕ. Вышеуказанная матрица получена из координат цветности цветового пространства и хроматической адаптации к стандартному осветителю CIE D50

Значения тристимула XYZ 0,0000, 0,0000, 0,0000 в пространстве соединения профиля (XYZ PCS v2) должны соответствуют контрольной черной точке. XYZ трехцветного значения 0,9642, 1,000, 0,8249 должен соответствовать опорному отображению белой точке.

NB: предупреждение белого не является (1.0, 1.0, 1.0).

от Adobe RGB (1998)
(для изображений без профиля ICC и т.д.)
Это может быть полезно для вычислений (и белая точка для sRGB является предварительной (и это D65)).

4.3.1 Цветовое пространство и цветовое кодирование Adobe RGB (1998)

Цветность и яркость цветового пространства
Красный x = 0,6400, y = 0,3300
Зеленый x = 0,2100, y = 0,7100
Синий x = 0.1500, y = 0.0600
Белый x = 0,3127, y = 0,3290
Цветовое пространство белая точка должна быть равна опорной точки белого дисплея.
Черная точка цветового пространства должна быть равна контрольной черной точке.

NB: белый (x = 0.3127, y = 0.3290) соответствует D65.
(См. Раздел 4.2.1 "Резервный дисплей".)


Цветность окружающего освещения
(Не путайте с отображаемой белой точкой. Это влияет на правильность цвета, которую мы можем видеть.)

из Adobe RGB (черновик)

3.1.4 Условия просмотра ссылок
4. Ссылка Окружная белая точка x = 0.3457, y = 0.3585 (D50)

из Adobe RGB (1998)

Приложение B.
Окружающая освещенность Хроматичность:... Окружающая освещенность цветность может быть от D65 до D50...


Отобразить белую точку
(Не путайте цветность окружающего освещения. Это примерно тот диапазон, который может отображаться на дисплее.)

из sRGB

  1. Опорная индикация цветности белой точки: x = 0,3127, y = 0,3290, z = 0,3583 (эквивалент к цветности CIE Illuminant D65).

из Adobe RGB (1998)

4.2.1 Референс-дисплей White Point
ПРИМЕЧАНИЕ. Координаты цветности соответствуют стандарту CIE Illuminant D65.


из Adobe RGB (1998) (для информации.)

Приложение А. Профиль ICC Adobe RGB (1998) от Adobe Systems является экземпляром кодировки цветного изображения Adobe RGB (1998).

из sRGB

  1. Хроматическая адаптация и преобразование в ICC XYZ PCS

Пример: если D65 выбран в качестве белого цвета sRGB, chro преобразование адаптации matic будет идти от D65 до D50, результирующие значения D50 будут закодированы в теге mediaWhitePoint
...
Однако, если D50 были выбраны в качестве белого цвета sRGB, хроматическая адаптация не нужна...
IEC 61966-2-1 не определяет колориметрию эталонного дисплея SRGB адаптированных белой точку.

(NB: sRGB определен в IEC 61966-2-1)
Это означает, что для отображения sRGB не используется определенный белый (D65 и т.д.), Поэтому сохраните его в профиле ICC.


Стандартный источник света (wiki) (Только для информации. Не является частью этого преобразования.)
https://en.wikipedia.org/wiki/Standard_illuminant