数学转换 sRGB 和 Adob​​eRGB

Posted

技术标签:

【中文标题】数学转换 sRGB 和 Adob​​eRGB【英文标题】:Mathematical conversion sRGB and AdobeRGB 【发布时间】:2017-02-22 09:14:47 【问题描述】:

这是一个非常明确的问题,但我做了很多研究并没有找到答案。 this 或 this 的 *** 问题是关于 jpeg 转换的。 This是关于python内置库的。

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

是的,photoshop 确实做到了,而且有一些奇怪的在线计算器,显示另一个结果。

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

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

如果有人能描述,发生了什么或给出公式,我将非常感激。

更新

整数 rgbs 的大型结果数组也是正确答案。

【问题讨论】:

我认为(但我不确定),这种转换并不像它显示的那么简单。也许,这些链接会有所帮助:Completely Painless Programmer's Guide to XYZ, RGB, ICC, xyY, and TRCs 和 Colour Space Conversions (PDF) 这种转换一般分两部分进行,sRGB→XYZ然后XYZ→AdobeRGB。我看不出这两个操作不能合并的任何原因。 请参阅RGB/XYZ Matrices 了解您正在寻找的公式。 @MarkRansom sRGB→XYZ 包含非线性操作。我认为这就是两个操作无法合并的原因。 sRGB 的参考白点为 D65,AdobeRGB 的参考白点为 D50。这也许是不将它们结合起来的另一个原因。并且使用 XYZ 在转换到其他颜色空间方面更加灵活。 我已经尝试了将近一个星期来想出这个问题的答案,但这并不像看起来那么容易。事实证明,XYZ 范围没有标准化——sRGB 使用 Y 【参考方案1】:

这有点复杂,所以如果您需要公式,请阅读规格表。

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

维基也不错。 sRGBhttps://en.wikipedia.org/wiki/SRGB_color_space Adobe RGBhttps://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 和 Adob​​e RGB 之间)转换更灵活。

RGB色彩空间https://en.wikipedia.org/wiki/RGB_color_space


sRGB 和 XYZ 之间的转换包含非线性操作。 所以,sRGB和Adobe RGB之间的直接转换比较困难。

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

来自规格表

如果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 之间的转换也包含非线性操作。 (四舍五入到整数)

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


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

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

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

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

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

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


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

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

    从 XYZ (D65) 转换为线性 sRGB 值

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

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

4.3.6 在 24 位 Adob​​e RGB (1998) 中编码 ICC PCS 版本 2 值 4.3.6.1 将 XYZ 转换为 RGB 三色值 注意 上面的矩阵是从色彩空间色度坐标推导出来的,色度适应 CIE 标准光源 D50

Profile Connection Space (XYZ PCS v2) 中的 XYZ 三色值 0.0000、0.0000、0.0000 应 对应于参考显示黑点。 XYZ 三色值 0.9642、1.000、0.8249 应对应于参考显示白点。

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

来自 Adob​​e RGB(1998) (对于没有 ICC 配置文件等的图像) 这可能对 calc 有好处(sRGB 的白点是已知的(它是 D65))。

4.3.1 Adob​​e 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 参考显示白点。)


环境照明色度 (不要与显示白点混淆。这对我们可以看到的颜色正确性有影响。)

来自 Adob​​e RGB(草稿)

3.1.4 参考观看条件 4. 参考环境白点 x = 0.3457, y = 0.3585 (D50)

来自 Adob​​e RGB (1998)

附件 B. 环境照明色度:... 环境照明 色度可能是D65到D50 ...


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

来自 sRGB

    参考显示白点色度: x = 0.3127,y = 0.3290,z = 0.3583(等效 CIE Illuminant D65 的色度)。

来自 Adob​​e RGB (1998)

4.2.1 参考显示白点 注意色度坐标对应于 CIE 标准光源 D65。


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

附件 A。 Adobe Systems 的 Adob​​e RGB(1998) ICC 配置文件是 Adob​​e RGB(1998) 彩色图像编码的一个实例。

来自 sRGB

    色彩适应和转换为 ICC XYZ PCS

示例:如果选择 D65 作为 sRGB 适配白色,则 chro matic 自适应变换将从 D65 变为 D50,生成的 D50 值将编码在 mediaWhitePoint 标签中 ... 但是,如果选择 D50 作为 sRGB 适配白色, 不需要色彩适应 ... IEC 61966-2-1 未指定 sRGB 参考显示器适配白点的色度。

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


标准光源(wiki)(仅供参考。不属于此转换。)https://en.wikipedia.org/wiki/Standard_illuminant

【讨论】:

Adobe reference 表示“注意色度坐标对应于 CIE 标准光源 D65”。我不知道为什么每个人都坚持说 Adob​​e RGB 是 D50,除了 所有 ICC 配置文件都引用了 D50。 @MarkRansom D65 用于显示,而不是用于“环境照明”。来自 Adob​​e 参考中的附件 B,“环境照明色度可能是 D65 到 D50”,以及来自“第 4.3.6.1 节将 XYZ 转换为 RGB 三色值”“注意上述矩阵来自色彩空间色度坐标,以及适配 CIE 标准光源 D50" 来自附件 A “Adobe Systems 的 Adob​​e RGB(1998) ICC 配置文件是 Adob​​e RGB(1998) 彩色图像编码的一个实例。”所以,我认为 D50 是正确的。 4.3.1.1:“色彩空间白点应等于参考显示白点。”正如我上面所说,所有 ICC 配置文件都使用 D50 白点,所以如果您的色彩空间没有,那么创建配置文件需要一个额外的步骤。但这个问题与ICC配置文件无关。 @MarkRansom 现在我明白了。 Adobe 参考有两个转换矩阵(用于 D65 和 D50)。 4.3.1 (D65) 和 4.3.6 (D50) 用途不同。【参考方案2】:

这是实现公式的 Python 代码。如 cmets 中所述,您从一种颜色空间转换为 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

【讨论】:

我自己已经做了这样的代码,但是我认为您已经进行了更认真的研究,所以我认为它应该是正确的答案,谢谢。 @MarkRansom 最好添加注释 XYZ 是针对哪个白点。 sRGB 本身未针对 D65 锁定。 (并且也需要 ICC 配置文件连接空间(例如,规格表中的 XYZ pcs v2)。) @Toris,Mark 的代码没有使用 ICC PCS,他根本没有使用 ICC。他直接从 D65 RGB 到 D65 XYZ 再到 D65 RGB。因为他使用的是 XYZ D65,所以不需要色度适应。看到这个有用的页面:brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html

以上是关于数学转换 sRGB 和 Adob​​eRGB的主要内容,如果未能解决你的问题,请参考以下文章

sRGB XYZ等不同色度空间的转换

将 Flex 转换为 Adob​​e Air

将 Adob​​e PDF 日期字符串转换为 NSDate

颜色字符串转换(正则)

关于单反相机的RAW和photoshop编辑srgb 和adobe rgb

将 Adob​​e Flash Builder 游戏转换为 Air?