我正在为我的小马探测器写阴影去除。在我将 PNG 图像从 sRGB 转换为 CIE XYZ后,我按照说明删除了亮度:
当我尝试将图像转换回 sRGB 进行显示时,我得到的 RGB 值超出了sRGB 色域(我得到的值大于 255)。这是正常的,还是我应该继续寻找错误?注意:在不修改的情况下转换为 XYZ 并返回不会产生故障。
插图(左上:原始,左下:红色和蓝色色调的字节值包装):
为了完整性:右上:颜色比率,右下:转换为 HSV 并均衡值。
我正在为我的小马探测器写阴影去除。在我将 PNG 图像从 sRGB 转换为 CIE XYZ后,我按照说明删除了亮度:
当我尝试将图像转换回 sRGB 进行显示时,我得到的 RGB 值超出了sRGB 色域(我得到的值大于 255)。这是正常的,还是我应该继续寻找错误?注意:在不修改的情况下转换为 XYZ 并返回不会产生故障。
插图(左上:原始,左下:红色和蓝色色调的字节值包装):
为了完整性:右上:颜色比率,右下:转换为 HSV 并均衡值。
最终的转换不会移除亮度,它会创建两个新值x和y,它们共同定义色度,而 Y 包含亮度。这是您的说明链接中的关键段落(就在您链接的公式之前):
CIE XYZ 颜色空间是经过精心设计的,因此 Y 参数是颜色亮度或亮度的度量。然后由两个派生参数 x 和 y 指定颜色的色度,这是三个归一化值中的两个,它们是所有三个三色值 X、Y 和 Z 的函数:
这意味着如果您有一个具有单一颜色的表面图像,但表面的一部分在阴影中,那么在 xyY 空间中,x 和 y 值应该相同(或非常相似)表面上的所有像素,无论它们是否在阴影中。
从最终转换中获得的 xyz 值不能直接转换回 RGB,就好像它们是 XYZ 值一样(注意大写)。因此,要回答您的实际问题:如果您使用 xyz 值,就好像它们是 XYZ 值一样,那么您的代码中就没有错误。使用您链接的公式无法将其转换为 RGB。
现在,如果您想真正从整个图像中删除阴影,您要做的是:
这应该会给你一个非常无聊但没有阴影的原始图像版本。当然,如果您的目标是检测单色区域,您也可以只对 xyY 图像中的 xy 值执行此操作,并使用您在原始图像上检测到的区域。