【问题标题】:Convert RGB to sRGB?将RGB转换为sRGB?
【发布时间】:2016-06-27 10:14:44
【问题描述】:

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

"RGB 或 CMYK 值首先必须转换为特定的 绝对色彩空间,例如 sRGB 或 Adob​​e RGB。本次调整将 依赖于设备,但转换的结果数据将是 独立于设备,允许将数据转换为 CIE 1931 颜色空间,然后转化为 L*a * b*。”

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

【问题讨论】:

标签: image image-processing colors


【解决方案1】:

不,您不应该从(线性)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() 的方法,有一个 gamma 编码和解码。 OpenCV颜色转换API:http://docs.opencv.org/3.1.0/de/d25/imgproc_color_conversions.html

【讨论】:

  • 谢谢@Sanchit!很高兴终于了解这些色彩空间是如何工作的。 真的感谢深思熟虑的答案和有趣的链接——尤其是链接。 ? 对于其他处理 SVG 滤镜效果中色彩空间问题的人,这解释了为什么需要添加 color-interpolation-filters="sRGB"。否则过滤器默认为linearRGB。伽马信息的丢失导致图像看起来褪色。要解决此问题,请更新滤镜的色彩空间。
  • @TannerHodges:欢迎您 :) 很高兴您喜欢我的回答。
猜你喜欢
  • 1970-01-01
  • 2020-08-09
  • 2016-10-17
  • 1970-01-01
  • 2021-04-21
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
  • 1970-01-01
相关资源
最近更新 更多