我正在尝试将RGB转换为感知上均匀的色彩空间CIELAB。维基百科说:
“首先必须将RGB或CMYK值转换为特定值 绝对色彩空间,例如sRGB或Adobe RGB。这种调整会 取决于设备,但转换的结果数据将是 与设备无关,允许将数据转换为CIE 1931 颜色空间然后转换成L * a * b *。“
我知道转换为sRGB后会有一些简单的转换,但我没有找到任何从RGB到sRGB的材料。那么,有哪些方法可以进行这样的转换?
答案 0 :(得分:2)
不,你不应该从(线性)RGB转到sRGB。事实上,它是相反的。以下是步骤:
将sRGB转换为线性RGB。 sRGB图像是伽马编码,这意味着相机将伽马函数 pow(x,1 / 2.2)应用于光信号。这个sRGB处于非线性的伽马空间中。
现在,将线性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()的方法,有一个gamma编码和解码。 OpenCV颜色转换API:http://docs.opencv.org/3.1.0/de/d25/imgproc_color_conversions.html