数学转换sRGB和AdobeRGB

数学转换sRGB和AdobeRGB,adobe,rgb,srgb,Adobe,Rgb,Srgb,这是一个非常清楚的问题,但我做了很多研究,并没有找到答案。有关jpeg转换的堆栈溢出问题。是关于python内置库的 那么,如何将sRGB转换为AdobeRGB,反之亦然???我指的是一个数学函数,它将3个字节转换成3个字节。没有jpges,等等。只需数学功能即可使用笔和纸转换颜色 是的,photoshop确实做到了,还有一些奇怪的在线计算器,显示了另一个结果 为什么我不能在谷歌找到一个简单的公式 我开始想,我不知道什么,我的问题也没有直接的答案 如果有人能描述发生了什么或给出公式,我将非常感激

这是一个非常清楚的问题,但我做了很多研究,并没有找到答案。有关jpeg转换的堆栈溢出问题。是关于python内置库的

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

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

为什么我不能在谷歌找到一个简单的公式

我开始想,我不知道什么,我的问题也没有直接的答案

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

更新


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

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

sRGB(PDF)

Adobe RGB(2004年10月12日草稿)(PDF)

Adobe RGB(1998)(PDF)

维基也很好。
sRGB

Adobe RGB


对于测试,请检查颜色转换设置。
可能会发生特定于软件的转换。
(主要是在超出范围的情况下,但在某些设置中,不超出范围的值也会受到影响)

前。 Photoshop颜色设置

关于呈现意图
感性的
旨在保持颜色之间的视觉关系。。。即使颜色值本身可能会改变

相关阅读资料


在转换到其他颜色空间方面,使用XYZ比直接(在sRGB和Adobe RGB之间)转换更灵活

RGB颜色空间


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。)

  • 从XYZ(D65)到线性sRGB值的转换

  • 在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 PC版本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 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
    颜色空间白点应等于参考显示白点。
    颜色空间黑点应等于参考显示黑点

    注意:白色(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


    显示白点
    (不要与环境照明混淆。)
    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