sRGB-> CIEXYZ->丢弃亮度的结果是否可以转换回sRGB?

Ans*_*iņš 5 colors computer-vision color-space srgb

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


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

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

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

jil*_*wit 1

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

CIE XYZ 颜色空间经过精心设计,以便 Y 参数是颜色亮度或辉度的度量。然后,颜色的色度由两个派生参数 x 和 y 指定,这三个标准化值中的两个是所有三个三刺激值 X、Y 和 Z 的函数:

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

从最终转换中获得的 xyz 值无法像 XYZ 值一样直接转换回 RGB(注意大写)。因此,要回答您的实际问题:如果您将 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 值执行此操作,并使用您在原始图像上检测到的区域。