我正在为pony detector编写阴影消除功能。在converted a PNG image from sRGB to CIE XYZ之后,我删除了亮度as per instructions:


当我尝试将图像转换回sRGB以进行显示时,我得到的RGB值不在sRGB gamut范围内(我得到的值大于255)。 这是正常现象吗,还是我应该继续寻找错误? 注意:转换为XYZ且不做任何修改就不会产生任何故障。

插图(左上:original,左下:红色和蓝色色调的字节值wraparaund):

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

最佳答案

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



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

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

现在,如果您想从整个图像中去除阴影,您可以执行以下操作:

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


  • 然后到RGB:


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

  • 这将为您提供原始图像的非常无聊但没有阴影的版本。当然,如果您的目标是检测单色区域,则也可以对xyY图像中的xy值执行此操作,并使用在原始图像上检测到的区域。

    10-05 21:18
    查看更多