数学转换sRGB和AdobeRGB

时间:2016-10-13 09:52:18

标签: adobe rgb srgb

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

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

是的,photoshop实际上是这样做的,并且有一些奇怪的在线计算器,显示另一个结果。

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

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

如果有人可以描述,正在发生什么或给出公式,我将非常感激。

更新

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

2 个答案:

答案 0 :(得分:3)

这是实现公式的Python代码。如注释中所述,您将从一个颜色空间转换为XYZ(标准化),然后从XYZ转换为新的颜色空间。我对这些功能的准确性并不是百分之百满意,但它应该会让你大吃一惊。当我提出改进时,我会将它们编辑成答案。

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

答案 1 :(得分: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

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之间的直接转换很困难。

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

更确切地说,它是Adobe RGB(浮点值)到Adobe RGB(在int值中)转换。

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

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

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

只有1(矩阵和公式)在转换值时有效,
但是2和3也很重要,因为它们决定了我们如何看到RGB值 注意:使用ICC配置文件时,如果存储了2(显示设置),则它会依赖。

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

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

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

来自sRGB的

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

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

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

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

  

4.3.6在24位Adobe RGB(1998)中编码ICC PCS版本2值   4.3.6.1将XYZ转换为RGB三刺激值
  注:上述矩阵源自色空间色度坐标,以及对CIE标准光源<色> D50 的色彩适应性

     

轮廓连接空间(XYZ PCS v2)中的XYZ三刺激值0.0000,0.0000,0.0000应   对应于参考显示黑点。 XYZ三刺激值0.9642,1.000,0.8249应对应于参考显示白点。

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

来自Adobe RGB(1998)
(对于没有ICC配置文件等的图像)
这对于计算可能是好的(并且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
  色空间白点应等于参考显示白点   色空间黑点应等于参考显示黑点。

注意:白色(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的色度。
  2.   

来自Adobe RGB(1998)

  

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

来自Adobe RGB(1998)的

(供参考。)

  

附件A.   来自Adobe Systems的Adobe RGB(1998)ICC配置文件是Adobe RGB(1998)彩色图像编码的实例。

来自sRGB

  
      
  1. 色度适应并转换为ICC XYZ PCS
  2.         

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

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

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