5

我正在为我的小马探测器写阴影去除。在我将 PNG 图像从 sRGB 转换为 CIE XYZ后,我按照说明删除了亮度:


当我尝试将图像转换回 sRGB 进行显示时,我得到的 RGB 值超出了sRGB 色域(我得到的值大于 255)。这是正常的,还是我应该继续寻找错误?注意:在不修改的情况下转换为 XYZ 并返回不会产生故障。

插图(左上:原始,左下:红色和蓝色色调的字节值包装):

为了完整性:右上:颜色比率,右下:转换为 HSV 并均衡值。

4

1 回答 1

1

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

CIE XYZ 颜色空间是经过精心设计的,因此 Y 参数是颜色亮度或亮度的度量。然后由两个派生参数 x 和 y 指定颜色的色度,这是三个归一化值中的两个,它们是所有三个三色值 X、Y 和 Z 的函数:

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

从最终转换中获得的 xyz 值不能直接转换回 RGB,就好像它们是 XYZ 值一样(注意大写)。因此,要回答您的实际问题:如果您使用 xyz 值,就好像它们是 XYZ 值一样,那么您的代码中就没有错误。使用您链接的公式无法将其转换为 RGB。

现在,如果您想真正从整个图像中删除阴影,您要做的是:

  • 通过将每个值除以 255(假设 24 位 RGB)将 RGB 值缩放为 [0-1] 范围内的浮点值。转换为浮点数对准确性有很大帮助!
  • 将图像转换为 xyY
  • 将所有 Y 值替换为一个值,例如 0.5,但要进行实验。
  • 反转转换,从 xyY 到 XYZ:

X 来自 xyY

来自 xyY 的 Z

  • 然后到RGB:

XYZ 转 RGB

  • 然后在 [0..255] 间隔上重新调整 RGB 值。

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

于 2011-06-01T15:29:34.710 回答