0

有没有办法CIE 色度坐标到灰度值(0 到 255)?

ImageJ、R 或 Python 中的任何现有实现?还是公式?

这是取自这里的表格。

在此处输入图像描述

4

1 回答 1

2

OP的问题:

有没有办法 CIE 色度坐标到灰度值(0 到 255)?

简短的回答:

对于 XYZ 和 xyY,亮度都是 Y,因此灰度是 Y。

更长的答案:

Y 是线性的,因此任何 gamma 编码的 RGB 空间都需要在转换为 Y 之前进行线性化,并且 Y 值必须应用 gamma 才能转换回相同的 RGB 空间。

白点列表中给出的坐标不会创建灰度,因为它们只是色度坐标,不包括任何 Y 值。

目前尚不清楚您想在这里做什么。我可能会假设你想创建一个 RGB 灰度的东西。但是,您想使用众多 RGB 空间中的哪一个?您实际上想要制作什么灰度?


回答另一个答案

在对另一个有错误的答案的评论中,作者要求解释原因。以下是对该答案的细分。

因为 x,y 色度1坐标描述了我们对颜色2的感知,并且是通过实验获得的3,所以理解它们的最佳方法是通过 CIE 的数据表4

为什么 xyy

  1. 它是“色度”色度城市。

  2. xy 色度坐标不会“描述我们对颜色的感知”,您需要一个颜色外观模型。1931 年色度图上的 xy 坐标最多可以预测(有很大误差)相对于白点的近似色调和色度。仍然需要亮度分量 Y。

  3. xy坐标不是“通过实验获得的”

    • CIE 标准观察者是通过组合/平均 17 名测试对象的实验数据创建的,这些数据大约在 1924 年收集。
    • 该数据形成光谱轨迹,即色度图的外缘。您可以说是实验性创建的。
    • 测量给定的刺激以确定 xy 坐标,或根据已知波长计算 xy 坐标等。
  4. 建议阅读一些抽象的数字列表并不能帮助任何人理解任何事情。

    • CIE 1931 上的 Wiki 页面的链接更好,尽管它直接指向标准观察者并跳过了有用的背景和基础。
    • 我在这篇文章的底部列出了一些资源。

x,y 坐标指定颜色5,没有关联的亮度6(〜亮度)7

  1. 不,xy 坐标表示相对于白点并在一定误差范围内的色调和色度。但是颜色是一种感知,对于特定的颜色感觉不仅仅是坐标。

  2. 部分正确...是的,一个 xy 点不考虑亮度,但这意味着饱和度也是未知的。一个 xy 点并不能告诉我们相对白点的 xy 点。如果我们只有一个 xy 点并且我们不知道 Y 并且我们不知道白点,那么:

    • NO,我们不知道实际颜色
      • 我们不知道确切的色调
      • 我们不知道确切的色度
      • 我们根本不知道饱和度
      • 我们根本不知道明/暗/明
    • 所以,在不知道任何这些事情的情况下,我想你可以说“xy 坐标指定一种颜色,如果我们也知道我们不知道的亮度和白点,那么 xy 坐标是潜在颜色的未发芽种子” .
  3. ALSO 亮度不是亮度。光明、光明、黑暗都是知觉。亮度是光谱加权的,除光谱加权外,不模拟感知。

您可以通过选择任何值来添加此亮度 Y。现在,您在 Yxy 颜色空间中有了一种颜色(例如 0.5)。

  • ???不,您不能只选择任何值。?!?!?
    • 亮度值是外观的关键组成部分...
    • 但此外,它是灰度的唯一组成部分。
    • 典型的灰度是 Y,xy 被丢弃。
    • 由于 Y 是整个灰度,很明显你不能“随便挑”。

将其转换为 XYZ 三元组:X = Y / y * x&Z = Y / y * (1-x-y)

  • 虽然这是一个值得称道的剪切和粘贴,但当小 y 为 0 时会发生什么?它可能发生在一些现代色彩空间中,并且是一些变换的结果。至少钳制小 y 以便不会出现除以零的问题(如果我们想保留负值,这不是一个完整的解决方案):
                        //  from SeeLab color library
    function xyYtoXYZ ( ltlx, ltly, oldY ) {
        if (ltly > 0.0) {
            Y = Math.max(oldY,0.0); // sanity check
            X = (ltlx * Y) / ltly;
            Z = ((1.0 - ltlx - ltly) * Y) / ltly;
        } else {
              // clamp X Z to 0 if ltly is <= 0
            X = Z = 0.0;
            Y = Math.max(oldY,0.0);
        }
        return [X,Y,Z]
    }

最后,使用此矩阵乘法将 XYZ 转换为 RGB:

最后??好吧,最后没有,一点也没有。这里没有做任何事情来创建灰度。

此外,给出的矩阵是 XYZ 到 CIERGB 矩阵,即 CIERGB,一个几乎没有实际用途的颜色空间。原色是虚构的,无法实现为实际颜色。这使得它主要用作 XYZ 派生的理论 RGB 空间。

我们有 XYZ 是因为 CIERGB 有负值,而在计算机之前的时代,当计算尺是计算方法时,处理负数是很困难的。XYZ 只是 CIERGB 的“全正”投影,转换为 CIERGB 并没有实际好处。

真正的 RGB,如 sRGB

通常情况下,你想去一个真正的 RGB 空间,比如 sRGB,那是一个不同的矩阵。如果没有声明 RGB 空间,则sRGB 是假定的默认值(不是 CIERGB)。事实上,色彩空间原色和白点的每种组合都会有自己的矩阵。

最后还是不行,因为大多数色彩空间也有伽玛或传递函数,在转换矩阵之后,您必须在乘以 255(或每个目标位深度的任何因子)之前应用伽玛。

如果结果值由于值太大而超出 RGB 色域,请选择较小的 Y 值,这相当于缩小 RGB 值(等量缩放所有三个值)。

仅更改 Y 而不调整其他坐标会导致饱和度发生变化。在 dataviz 等某些应用程序中,您希望避免饱和偏移,因此这种方法失败了。更重要的是,xyY 并不是尝试色域映射的最佳空间,因为它在感知上根本不统一。

如果因为 x,y 坐标不能用 RGB 原色表示而存在负值,那么您必须找到可以的坐标近似值。

实际上想要做的是重新映射色域以找到具有适当感知意图的值。同样,这不是一个很好的空间。

这等效于找到位于色域内的最近的 RGB 三元组。一种简单的方法是将任何负值设置为 0。

Nearest 不一定在理想向量上。硬剪辑当然是微不足道的,但也远非最佳实践。具有其他通道平衡的软夹具是首选的琐碎修复。如果您在 RGB 值的运行范围内或低于运行范围内进行裁剪,您将有一些巨大的感知变化,尤其是色调。同样,您通常需要真正的色域映射。

要点:

输出空间的较小色域将需要对色域外的值进行色域映射,而那些超出色域的值可能是正的或负的。仅调整 xyY 或 XYZ 坐标中的一个不太可能保持感知意图,无论如何,这与灰度有什么关系?没有什么!

根据定义,灰度是消色差的。这意味着 xy 坐标将始终位于白色和黑色之间的线上。根据定义,您不会超出色域(超白或超黑除外)。

TL;博士

回答了 OP 的问题“灰度在 Y 上,而不是 xy”。

OP 问题的另一个答案与所述无关,但这在很大程度上是因为 OP 的问题可能真的是在问一个不同的问题(目前我不知道)。

资源

Colorimetry Understanding the CIE System by Janos Schanda (2007) 我在网上看过 PDF,它是其中大部分内容的规范参考。

Hunt、Fairchild、Burns、Stone 的书也不错。

对于实际应用,Larry Arend 的 NASA 色彩网站很好:https ://colorusage.arc.nasa.gov

Bruce McEvoy 的网站非常棒:https ://www.handprint.com/HP/WCL/wcolor.html

祝你好运。

于 2021-10-24T15:38:18.683 回答