【问题标题】:How to convert CIE xy value to gray scale value如何将 CIE xy 值转换为灰度值
【发布时间】:2021-03-18 11:55:35
【问题描述】:

有没有办法CIE chromaticity coordinates转灰度值(0到255)?

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

这是取自here的表格。

【问题讨论】:

  • 你不能。色度与色调有关,与亮度无关。灰色、黑色、白色都具有相同的色度。注意:我们经常用 xyY 绘制颜色(其中 Y 是发光)。所以 xy 只是我们需要指定可见颜色的 3 个维度中的 2 个。
  • 讽刺的是,当您询问灰度(即消色差亮度)时,这是一个“xy 问题”,并列出了一个消色差白点坐标表,所有这些都与任何亮度值无关.可以从该表中确定的 MOST 是相对于不同白点的色度。但不是定义“灰度”的亮度。所以“y”是......也许你可以澄清你具体想要做什么或处理什么?

标签: r image-processing computer-vision imagej cielab


【解决方案1】:

OP 的问题:

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

简答:

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

更长的答案:

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

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

不清楚你想在这里做什么。我可能会假设你想创建一个 RGB 灰度的东西。但是,您想使用众多 RGB 空间中的哪一个?您真正想要对什么进行灰度处理?


另作回答

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

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

为什么选择 xyY

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

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

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

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

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

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

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

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

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

您可以通过选择任何值来添加此亮度 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

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

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

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

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

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

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

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

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

要点:

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

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

TL;DR

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

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

资源

Janos Schanda (2007) 了解 CIE 系统的比色法 我在网上看过 PDF,它是其中大部分内容的规范参考。

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

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

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

祝你好运。

【讨论】:

  • 如有其他问题,请随时咨询,我会尽量在一天内回答。
猜你喜欢
  • 1970-01-01
  • 2022-11-05
  • 1970-01-01
  • 2018-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-05
  • 1970-01-01
相关资源
最近更新 更多