17

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

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

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

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

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

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

更新

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

4

2 回答 2

9

这是实现公式的 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
于 2016-10-25T04:13:20.320 回答
2

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

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

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

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


sRGB 和 XYZ 之间的转换包含非线性操作。
因此,sRGB 和 Adob​​e 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。
绿色和蓝色也有相同的公式。


不妨碍其他色彩空间之间的直接转换,但
Adob​​e 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。)

  1. 从 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 应对应于参考显示白点。

NB:小心白色不是(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
色彩空间白点应等于参考显示白色观点。
色彩空间黑点应等于参考显示黑点。

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

  1. 参考显示白点色度: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. Adob​​e Systems 的 Adob​​e RGB(1998) ICC 配置文件是 Adob​​e RGB(1998) 彩色图像编码的一个实例。

来自 sRGB

  1. 色彩适应和转换为 ICC XYZ PCS

示例:如果选择 D65 作为 sRGB 自适应白色,则色度自适应变换将从 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

于 2016-10-23T21:44:56.027 回答