将RGB转换为sRGB?

use*_*860 8 image colors image-processing

我正在尝试将RGB转换为感知均匀的色彩空间CIELAB。维基百科指出:

“首先必须将RGB或CMYK值转换为特定的绝对色彩空间,例如sRGB或Adobe RGB。此调整将取决于设备,但是转换后的结果数据将与设备无关,从而允许对数据进行转换转换为CIE 1931颜色空间,然后转换为L * a * b *。”

我知道一旦转换为sRGB,会有一些简单的转换,但是我还没有发现任何从RGB到sRGB的材料。那么,存在哪些方法可以进行这种转换?

San*_*hit 7

不,您不应该从(线性)RGB转到sRGB。实际上,反之亦然。步骤如下:

  1. 将sRGB转换为线性RGB。sRGB图像是伽玛编码的,这意味着相机将伽玛函数pow(x,1 / 2.2)应用于光信号。该sRGB在非线性的伽马空间中。

  2. 现在,将线性RGB转换为LAB涉及两个步骤:首先是将线性RGB转换为XYZ颜色空间(这是基本的颜色空间)。该转换是线性运算,即矩阵乘法。这就是为什么您需要线性RGB值而不是sRGB的原因。它必须在线性空间中。最后,XYZ值通过包含一些标准公式的非线性操作转换为LAB值(您不必担心)。

有趣的链接:

(i)了解sRGB和线性RGB空间:http//filmicgames.com/archives/299http://www.cambridgeincolour.com/tutorials/gamma-correction.htm

(ii)MATLAB教程:https//de.mathworks.com/help/vision/ref/colorspaceconversion.html

(iii)Python软件包:http//pydoc.net/Python/pwkit/0.2.1/pwkit.colormaps/

(iv)C代码:http//svn.int64.org/viewvc/int64/colors/color.c?view = markup

(v)OpenCV不会将sRGB转换为线性RGB,但会在color.cpp代码(OpenCV_DIR \ modules \ imgproc \ src \ color.cpp)内部进行转换。检出称为initLabTabs()的方法,其中存在伽马编码和解码。OpenCV颜色转换API:http : //docs.opencv.org/3.1.0/de/d25/imgproc_color_conversions.html

  • 谢谢@Sanchit!很高兴终于了解这些色彩空间是如何工作的。_真的_感谢深思熟虑的答案和有趣的链接——尤其是链接。对于在 SVG 滤镜效果中处理色彩空间问题的其他人,这解释了为什么您需要添加 `color-interpolation-filters="sRGB"`。否则过滤器默认为`linearRGB`。伽马信息的丢失会导致图像看起来褪色。要修复,请更新滤镜的色彩空间。 (2认同)