gpt4 book ai didi

python - 将图像从 RGB 转换为 LUV 并返回会产生不同的图像

转载 作者:行者123 更新时间:2023-11-30 22:02:34 24 4
gpt4 key购买 nike

我目前正在尝试从原始 RGB 图像开始,将其转换为 LUV,执行一些操作(即旋转色调),然后将其旋转回 RGB 以用于显示目的。然而,我遇到了一个令人烦恼的问题,即 RGB 到 LUV 的转换(反之亦然)似乎正在改变图像。具体来说,如果我从 LUV 图像开始,将其转换为 RGB,然后将其更改回 LUV,而不更改其他任何内容,则原始图像会有所不同。颜色转换算法的 Python (cv2) 和 Matlab(开源)实现以及我自己的手动编码算法都发生过这种情况。这是一个例子:

luv1 = np.array([[[100,6.12,0]]]).astype('float32')
rgb1 = cv2.cvtColor(luv1,cv2.COLOR_Luv2RGB)
luv2 = cv2.cvtColor(rgb1,cv2.COLOR_RGB2Luv)
print(luv2)
[[[99.36293 1.3064307 -1.0494182]]]

如您所见,LUV 坐标已从输入中更改。这是因为某些 LUV 坐标在 RGB 空间中没有直接匹配吗?

最佳答案

是的,删除代码中的 astype('uint8') 位,如果正确实现转换,差异就会消失。

您可以在 Wikipedia 中查看转换方程。没有什么是不可逆转的,转换是彼此完美的逆。

但是,此转换包含 3rd 次幂,这确实会显着拉伸(stretch)某些值。转换为整数的四舍五入可能会导致颜色发生显着变化。

此外,Luv 域非常不规则,验证 Luv 值是否会产生有值(value)的 RGB 值可能并不容易。您的陈述“我已经验证 luv1 的条目全部落在允许的输入范围内”让我相信您认为 Luv 域是一个盒子。它不是。 uv 的范围随 L 变化。一个好的练习是从 RGB 立方体的采样开始,并将它们映射到 Luv,然后绘制这些点以查看 Luv 域的形状。维基百科有一个示例,说明它可能是什么样子 for the sRGB gamut .

OpenCV cvtColor 函数会将 RGB 值限制在 [0,1] 范围内(如果类型为 float32),如果输入为超出色域。

这是一个显示转换是可逆的示例。我从 RGB 值开始,因为这些值很容易验证是否有效:

import numpy as np
import cv2

rgb1 = np.array([[[1.0,1.0,1.0],[0.5,1.0,0.5],[0.0,0.5,0.5],[0.0,0.0,0.0]]], 'float32')
luv1 = cv2.cvtColor(rgb1, cv2.COLOR_RGB2Luv)
rgb2 = cv2.cvtColor(luv1, cv2.COLOR_Luv2RGB)
np.max(np.abs(rgb2-rgb1))

这将返回 2.8897537e-06,这是 32 位 float 的数值精度。

关于python - 将图像从 RGB 转换为 LUV 并返回会产生不同的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53768922/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com