将RGB转换为sRGB?

18

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

“RGB或CMYK值首先必须转换为特定的绝对颜色空间,例如sRGB或Adobe RGB。这个调整将依赖于设备,但是从转换得到的数据将是设备无关的,允许数据被转换到CIE 1931颜色空间,然后转换成L*a * b*。”

我知道一旦转换为sRGB,有一些直接的变换方法,但我没有找到任何从RGB到sRGB的材料。那么,存在哪些方法可以进行这样的转换呢?


3
请阅读sRGB规范。它解释了如何计算sRGB值。 https://www.w3.org/Graphics/Color/srgb 另外,这可能会有所帮助: http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html - Piglet
1个回答

17
不,你不应该从(线性)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/299; http://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


2
谢谢@Sanchit!终于理解这些颜色空间是如何工作的,真的非常感激你周到的回答和有趣的链接——尤其是链接。对于其他在SVG滤镜效果中处理颜色空间问题的人,这就解释了为什么需要添加color-interpolation-filters="sRGB"。否则,滤镜默认为linearRGB。这种伽马信息的丢失会导致图像看起来变得苍白。要解决这个问题,请更新您的滤镜的颜色空间。 - Tanner Hodges
@TannerHodges:不客气 :) 很高兴你喜欢我的回答。 - Sanchit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接