如何将 RGB 值转换为色温?

Posted

技术标签:

【中文标题】如何将 RGB 值转换为色温?【英文标题】:How to convert from RGB values to color temperature? 【发布时间】:2016-12-17 00:23:16 【问题描述】:

如何获取以 RGB 值表示的颜色(例如,从 0 到 255 的三个坐标)并从中生成开尔文(或 mireds)color temperature?

我看到this question 看起来非常接近。但是,问题提到了 x 和 y,an answer 提到了 R1 和 S1,我认为它们是 CIE XYZ 颜色空间坐标。我也不太清楚如何找到这些。其他人链接到论文。其他人says RGB 值在没有“说明色彩空间”的情况下毫无意义(我认为我的显示器决定仅根据 RGB 值显示一些东西?)。

有人可以在不指向其他地方并假设我知道所有颜色术语的情况下简单地布置整个事情吗?

【问题讨论】:

您需要从 RGB 转换为 Kelvin 还是从 Kelvin 转换为 RGB? 您对线性代数和(无限维)向量空间的精通程度如何? AFAIK 他们的概念实际上是为处理颜色理论而发明/开发的(作为先前已知的有限维向量概念的概括)。因此,如果允许使用这些数学领域的概念、名称和符号来回答这个问题,可能会更容易回答。 @cameronroytaylor RGB 转开尔文。 @das-g 我相当精通线性代数和向量空间。 还没有答案,但the math behind 这个online color calculator 可能有用。 【参考方案1】:

您可以使用Colour 使用colour.xy_to_CCT_Hernandez1999 定义执行该计算:

  import numpy as np
  import colour

  # Assuming sRGB encoded colour values.
  RGB = np.array([255.0, 235.0, 12.0])

  # Conversion to tristimulus values.
  XYZ = colour.sRGB_to_XYZ(RGB / 255)

  # Conversion to chromaticity coordinates.
  xy = colour.XYZ_to_xy(XYZ)

  # Conversion to correlated colour temperature in K.
  CCT = colour.xy_to_CCT(xy, 'hernandez1999')
  print(CCT)

  # 3557.10272422

【讨论】:

@dfrankow:很高兴它有帮助!如果答案解决了您的问题,请将其标记为已接受。如果您还有任何问题,请随时联系我。 只是一个注释,因为它没有明确说明:这假设 RGB 颜色实际上是 sRGB 颜色。这可能是错误的,但已经足够接近了。 @MichaelMauderer:这是由评论“# Assuming sRGB 编码颜色值”假设的。 (b0, b0, b0) 是网页/浏览器的工作 RGB 色彩空间的代码值,几乎可以肯定是 sRGB:w3.org/Graphics/Color/sRGB.html。您将在网上找到的大多数图像也是 sRGB 编码的,如果不是,它将被指定为另一个色彩空间(例如通过嵌入的 ICC 配置文件)。如果您不知道正在使用哪种编码,最安全的选择通常是假设它是 sRGB。大多数消费者显示器也已根据 sRGB 规格进行校准。 为什么浅蓝色的 [100.0, 100.0, 200.0] 会返回否定结果?【参考方案2】:

这是Java中的一个公式,

  double n = ((0.23881) * Color.red(previewColor) + (0.25499) * Color.green(previewColor) + (-0.58291) * Color.blue(previewColor)) / ((0.11109) * Color.red(previewColor) + (-0.85406) * Color.green(previewColor) + (0.52289) * Color.blue(previewColor));
  double cct  = 449 * Math.pow(n,3) + 3525 * Math.pow(n,2) + 6823.3 * n + 5520.33;

这里 previewColor 的值是颜色的整数表示

【讨论】:

以上是关于如何将 RGB 值转换为色温?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中将 RGB 颜色值转换为十六进制值?

如何将 RGB 输入转换为十进制颜色代码?

C# 使用 ICC 配置文件将 RGB 值转换为 CMYK?

如何将字符串颜色转换为其十六进制代码或 RGB 值?

js中如何把RGB颜色转换为16进制颜色

将 RGB 颜色值转换为十进制