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

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

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

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

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

Я подумал, что я чего-то не знаю и нет прямого ответа на мой вопрос.

Я буду очень благодарен, если кто-то может описать, что происходит или дайте формулу.

обновление

большой массив результатов для integer rgbs будет и правильный ответ.

2 ответов


вот код 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

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

sRGB (PDF)
https://www.w3.org/Graphics/Color/srgb
Adobe RGB (Oct .12,2004 проект) (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


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

ex. Фотошоп цвет settings
http://help.adobe.com/en_US/creativesuite/cs/using/WS6A727430-9717-42df-B578-C0AC705C54F0.html#WS6078C298-CB20-4dc8-ACD4-D344110AA026

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

обзоры readings
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
...

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 etc.)

4.3.6 кодирование ICC PCS версии 2 значения в 24-бит Adobe RGB (1998)
4.3.6.1 преобразование значений XYZ в RGB tristimulus
Примечание приведенная выше матрица является производной от цветового пространства координат цветности и цветовой адаптации для стандартного источника света МКО D50

значения XYZ tristimulus 0.0000, 0.0000, 0.0000 в пространстве соединения профиля (XYZ PCS v2) должны соответствует контрольному дисплею черная точка. Значения XYZ tristimulus 0.9642, 1.000, 0.8249 должны соответствовать контрольной точке белого дисплея.

NB: внимание белый не (1.0, 1.0, 1.0).

из Adobe RGB (1998)
(для изображений без профиля ICC и т. д.)
Это может быть хорошо для Calc (и белая точка для 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)

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


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

из sRGB

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

из Adobe RGB (1998)

4.2.1 Эталонный Дисплей Белая Точка
Обратите внимание, что координаты цветности соответствуют стандартному осветителю CIE 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)
Это означает, что не определено, какой белый(D65 и т. д.) используется для отображения sRGB, поэтому сохраните его в профиле ICC.


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