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
-
它是“色度”色度城市。
-
xy 色度坐标不能“描述我们对颜色的感知”,您需要一个颜色外观模型。 1931 年色度图上的 xy 坐标最多可以预测(有很大误差)相对于白点的近似色调和色度。仍然需要亮度分量 Y。
-
xy 坐标不是“通过实验获得的”
- CIE 标准观察者是通过组合/平均大约 1924 年收集的 17 名测试对象的实验数据创建的。
- 此数据形成光谱轨迹,即色度图的外缘。你可以说这个是实验性创建的。
- 测量给定刺激以确定 xy 坐标,或根据已知波长计算 xy 坐标等。
-
建议阅读一些抽象的数字列表并不能帮助任何人理解任何事情。
- CIE 1931 上的 Wiki 页面链接更好,尽管它直接指向标准观察者并跳过有用的背景和基础。
- 我在这篇文章的底部列出了一些资源。
x,y 坐标指定颜色5,没有亮度6(~亮度)关联7。
-
不,xy 坐标表示相对于白点并在一定误差范围内的色调和色度。但是颜色是一种感知,对于特定的颜色感觉不仅仅是坐标。
-
部分正确...是的,一个 xy 点不考虑亮度,但这意味着饱和度也是未知的。一个 xy 点并不能告诉我们相对白点的 xy 点。如果我们只有一个 xy 点并且我们不知道 Y 并且我们不知道白点,那么:
- 不,我们不知道实际颜色
- 我们不知道确切的色调
- 我们不知道确切的色度
- 我们根本不知道饱和度
- 我们根本不知道明/暗/明
- 所以,在不知道任何这些事情的情况下,我想你可以说 "xy 坐标指定颜色,如果我们也知道我们不知道的亮度和白点,那么 xy 坐标是未发芽的一种潜在颜色的种子”。
-
亮度也不是亮度。光明、光明、黑暗都是知觉。亮度是光谱加权光,除光谱加权外,不模拟感知。
您可以通过选择任何值来添加此亮度 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
祝你好运。