数学转换 sRGB 和 Adob​​eRGB

Mathematical conversion sRGB and AdobeRGB

这个问题很明确,但是我做了很多研究,没有找到答案。 this or this are about jpeg converting. This 的 Whosebug 问题是关于 python 内置库的。

那么,如何将 sRGB 转换为 Adob​​eRGB,反之亦然???我的意思是一个数学函数,将 3 个字节转换为 3 个字节。没有jpges,等等。只需 数学 函数即可使用笔和纸转换颜色。

是的,photoshop 实际上是这样做的,而且有一些奇怪的在线计算器会显示不同的结果。

为什么我在 google 中找不到简单的公式?

我开始思考,我不知道什么,我的问题没有直接的答案。

如果有人能描述一下,这是怎么回事或给出公式,我将不胜感激。

更新

整数 rgbs 的大量结果也将是正确答案。

有点复杂,所以如果你需要公式,请阅读规范sheets。

sRGB (PDF)
https://www.w3.org/Graphics/Color/srgb
Adobe RGB(2004 年 10 月 12 日草稿)(PDF)
http://www.color.org/adobergb.pdf
Adobe RGB (1998) (PDF)
https://www.adobe.com/digitalimag/pdfs/AdobeRGB1998.pdf

维基也不错。
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

About rendering intents
Perceptual
Aims to preserve the visual relationship between colors ... even though the color values themselves may change.

相关阅读
http://www.color-management-guide.com/conversion-mode-perceptual-relative-colorimetric-rendering-intent.html


使用 XYZ 比直接(在 sRGB 和 Adob​​e RGB 之间)转换更灵活地转换为其他颜色 spaces。

RGB 颜色 space
https://en.wikipedia.org/wiki/RGB_color_space


sRGB 和 XYZ 之间的转换包含非线性操作。
所以,sRGB 和 Adob​​e RGB 之间的直接转换是困难的。

请参阅 sRGB wiki 中的变换部分的规范。 (反向转换部分。)

来自规范 sheet

If R, G, B are less than or equal to 0.04045
RL = R/12.92
...
If R, G, B are greater than 0.04045
RL = ((R + 0.055)/1.055)^2.4
...

RL 为线性(XYZ(D65)),R 为 sRGB 在这个公式中。
绿色和蓝色也有相同的公式。


不阻止其他颜色之间的直接转换 spaces 但是,
Adobe RGB 和 XYZ 之间的转换也包含非线性操作。 (四舍五入为整数。)

更准确地说,它是 Adob​​e RGB(浮点值)到 Adob​​e RGB(整数值)的转换。


注意:它们的预期白点不同。
(因为用途不同。sRGB 用于显示,Adobe RGB 用于照片。)
规格 sheet 中的转换矩阵适用于 D65(sRGB) 和 D50 或 D65(Adobe RGB)。

我们应该考虑三件事。
RGB值本身、显示器的取值范围(以及颜色的正确性)、观看环境。

例如
1.Conversion矩阵(及其他公式):RGB值
2.Display白点和黑点:显示的取值范围
3.Ambient光照色度:观看环境

只有1(矩阵和公式)对数值转换有影响,
但 2 和 3 也很重要,因为它们决定了我们如何查看 RGB 值。
注意:对于 ICC 配置文件,如果存储了 2(显示设置),则它会计算在内。

如果显示范围窄于 RGB 值可以表示的范围,它们将被剪裁(显示时)。
如果范围不合适,白色或黑色可能会被视为灰色等。

如果环境照明色度不同于一个转换矩阵和公式,我们将看到不同的颜色。


转换矩阵
(这很重要,因为它会影响 RGB 转换值。)

来自 sRGB(显示转换矩阵适用于 D65。)

  1. Conversion from XYZ (D65) to linear sRGB values

在 Adob​​e RGB(1998) 规范 sheet 中,存在两种类型的转换矩阵(和公式)。
4.3.1~(无ICC):D65
4.3.6~(带ICC):D50

来自 Adob​​e RGB(1998)
(对于带有 ICC 配置文件等的图像)

4.3.6 Encoding ICC PCS Version 2 values in 24-bit Adobe RGB (1998)
4.3.6.1 Converting XYZ to RGB tristimulus values
NOTE The above matrix is derived from the color space chromaticity coordinates, and a chromatic adaptation to CIE Standard Illuminant D50

The XYZ tristimulus values 0.0000, 0.0000, 0.0000 in the Profile Connection Space (XYZ PCS v2) shall correspond to the reference display black point. The XYZ tristimulus values 0.9642, 1.000, 0.8249 shall correspond to the reference display white point.

注意:注意白色不是 (1.0, 1.0, 1.0)。

来自 Adob​​e RGB(1998)
(对于没有 ICC 配置文件等的图像)
这可能对计算有好处(并且 sRGB 的白点是预先知道的(它是 D65))。

4.3.1 The Adobe RGB(1998) Color Space And Color Image Encoding

Color space chromaticities and luminance
Red x=0.6400, y=0.3300
Green x=0.2100, y=0.7100
Blue x=0.1500, y=0.0600
White x=0.3127, y=0.3290
The color space white point shall be equal to the reference display white point.
The color space black point shall be equal to the reference display black point.

NB:White (x=0.3127, y=0.3290)对应D65.
(参见第 4.2.1 节参考显示白点。)


环境光色度
(不要与显示白点混淆。这会影响我们看到的颜色正确性。)

来自 Adob​​e RGB(草稿)

3.1.4 Reference Viewing Conditions
4. Reference Ambient White Point x = 0.3457, y = 0.3585 (D50)

来自 Adob​​e RGB (1998)

Annex B.
Ambient Illumination Chromaticity: ... The ambient illumination chromaticity may be D65 to D50 ...


显示白点
(不要与环境照明色度混淆。这是关于显示器可以显示的范围。)

来自 sRGB

  1. Reference display white point chromaticity: x = 0.3127, y = 0.3290, z = 0.3583 (equivalent to the chromaticity of CIE Illuminant D65).

来自 Adob​​e RGB (1998)

4.2.1 Reference Display White Point
NOTE The chromaticity coordinates correspond to CIE Standard Illuminant D65.


来自 Adob​​e RGB (1998)(供参考。)

Annex A. The Adobe RGB(1998) ICC profile from Adobe Systems is an instance of the Adobe RGB(1998) color image encoding.

来自 sRGB

  1. Chromatic adaptation and converting to the ICC XYZ PCS

Example: If D65 is selected as the sRGB adapted white, the chro matic adaptation transform will go from D65 to D50, the resulting D50 values will be encoded in the mediaWhitePoint tag
...
However, if D50 were selected as the sRGB adapted white, chromatic adaptation would not be necessary
...
IEC 61966-2-1 does not specify the colorimetry of the sRGB reference display adapted white point.

(注意:sRGB 在 IEC 61966-2-1 中定义)
这意味着它不是每个定义的白色(D65 等)用于显示 sRGB,因此将其存储在 ICC 配置文件中。


标准光源 (wiki)(仅供参考。不是此转换的一部分。)
https://en.wikipedia.org/wiki/Standard_illuminant

这里是 Python 实现公式的代码。如评论中所述,您从一种颜色 space 转换为 XYZ(标准化),然后从 XYZ 转换为新颜色 space。我对这些函数的准确性不是 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