sRGB转CIEXYZ再丢弃亮度的结果应该能转换回sRGB吗?

5
我正在为我的小马探测器编写去除阴影的功能。在将PNG图像从sRGB转换为CIE XYZ后,根据说明我会移除亮度(如下所示)


当我尝试将图像转换回sRGB以进行显示时,我得到的RGB值超出了sRGB色域范围(我获得的值大于255)。这是正常的吗,还是我应该继续寻找错误?注意:不经修改的转换到XYZ再转回来不会产生任何故障。
说明(左上方:原始, 左下方:红色和蓝色色调的字节值环绕):

为了完整起见:右上方:颜色比率,右下方:转换为HSV并均衡值。
1个回答

1
最终转换不会消除亮度,它会创建两个新值 xy,共同定义色度,而 Y 包含亮度。这是您的 说明链接 中的关键段落(就在您链接的公式之前):

CIE XYZ 色彩空间是有意设计的,使得 Y 参数是颜色的亮度或明度的度量。然后通过两个派生参数 x 和 y 指定颜色的色度,它们是三个三刺激值 X、Y 和 Z 的函数中的两个归一化值:

这意味着,如果您有一个单色表面的图像,但表面的一部分处于阴影中,则在 xyY 空间中,无论像素是否处于阴影中,表面上所有像素的 x 和 y 值应该相同(或非常相似)。

从最终转换中得到的xyz值不能直接翻译回RGB,如同它们是XYZ值一样(请注意大写)。因此,回答你的实际问题:如果你正在使用xyz值,就好像它们是XYZ值一样,那么你的代码中没有错误。使用你连接的公式将其转换为RGB是行不通的。

现在,如果你想要真正地从整个图像中移除阴影,你需要:

  • 将RGB值缩放为浮点值,并处于[0-1]范围内,通过将每个值除以255(假设24位RGB)。转换为浮点数可以极大地提高精度!
  • 将图像转换为xyY
  • 将所有的Y值替换为一个值,比如0.5,但要进行实验。
  • 反向转换,从xyY到XYZ:

X from xyY

Z from xyY

  • 然后转换为RGB:

XYZ to RGB

  • 然后将RGB值重新缩放到[0..255]区间。

这应该会给你一个非常无聊但没有阴影的原始图像版本。当然,如果你的目标是检测单色区域,你也可以在xyY图像的xy值上执行此操作,并在原始图像上使用你在那里检测到的区域。


我实现了你的建议,但是在xyY->XYZ步骤中,对于所有Y值似乎都无法通过断言(X,Y,Z∈[0;1])。 - Ansis Māliņš
RGB -> XYZ 步骤后的所有 XYZ 值是否都 ∈ [0; 1]? - jilles de wit
如果在RGB->XYZ步骤之后仅将所有Y值均等化,跳过XYX->xyY->XYZ步骤并直接转换回RGB,会发生什么? - jilles de wit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接