有没有办法CIE 色度坐标到灰度值(0 到 255)?
ImageJ、R 或 Python 中的任何现有实现?还是公式?
这是取自这里的表格。
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
它是“色度”色度城市。
xy 色度坐标不会“描述我们对颜色的感知”,您需要一个颜色外观模型。1931 年色度图上的 xy 坐标最多可以预测(有很大误差)相对于白点的近似色调和色度。仍然需要亮度分量 Y。
xy坐标不是“通过实验获得的”
建议阅读一些抽象的数字列表并不能帮助任何人理解任何事情。
x,y 坐标指定颜色5,没有关联的亮度6(〜亮度)7。
不,xy 坐标表示相对于白点并在一定误差范围内的色调和色度。但是颜色是一种感知,对于特定的颜色感觉不仅仅是坐标。
部分正确...是的,一个 xy 点不考虑亮度,但这意味着饱和度也是未知的。一个 xy 点并不能告诉我们相对白点的 xy 点。如果我们只有一个 xy 点并且我们不知道 Y 并且我们不知道白点,那么:
ALSO 亮度不是亮度。光明、光明、黑暗都是知觉。亮度是光谱加权的光,除光谱加权外,不模拟感知。
您可以通过选择任何值来添加此亮度 Y。现在,您在 Yxy 颜色空间中有了一种颜色(例如 0.5)。
将其转换为 XYZ 三元组:
X = Y / y * x
&Z = Y / y * (1-x-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 是假定的默认值(不是 CIERGB)。事实上,色彩空间原色和白点的每种组合都会有自己的矩阵。
最后还是不行,因为大多数色彩空间也有伽玛或传递函数,在转换矩阵之后,您必须在乘以 255(或每个目标位深度的任何因子)之前应用伽玛。
如果结果值由于值太大而超出 RGB 色域,请选择较小的 Y 值,这相当于缩小 RGB 值(等量缩放所有三个值)。
仅更改 Y 而不调整其他坐标会导致饱和度发生变化。在 dataviz 等某些应用程序中,您希望避免饱和偏移,因此这种方法失败了。更重要的是,xyY 并不是尝试色域映射的最佳空间,因为它在感知上根本不统一。
如果因为 x,y 坐标不能用 RGB 原色表示而存在负值,那么您必须找到可以的坐标近似值。
您实际上想要做的是重新映射色域以找到具有适当感知意图的值。同样,这不是一个很好的空间。
这等效于找到位于色域内的最近的 RGB 三元组。一种简单的方法是将任何负值设置为 0。
Nearest 不一定在理想向量上。硬剪辑当然是微不足道的,但也远非最佳实践。具有其他通道平衡的软夹具是首选的琐碎修复。如果您在 RGB 值的运行范围内或低于运行范围内进行裁剪,您将有一些巨大的感知变化,尤其是色调。同样,您通常需要真正的色域映射。
输出空间的较小色域将需要对色域外的值进行色域映射,而那些超出色域的值可能是正的或负的。仅调整 xyY 或 XYZ 坐标中的一个不太可能保持感知意图,无论如何,这与灰度有什么关系?没有什么!
根据定义,灰度是消色差的。这意味着 xy 坐标将始终位于白色和黑色之间的线上。根据定义,您不会超出色域(超白或超黑除外)。
回答了 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
祝你好运。