colors - 将 YCbCr 转换为 RGB 是否可逆?

标签 colors rgb yuv

我在尝试使用一些不同的图像格式时遇到了一些我觉得很奇怪的事情。当从 RGB 转换为 YCbCr 然后再转换回 RGB 时,结果与我开始时的结果非常相似(像素值的差异几乎总是小于 4)。但是,当我从 YCbCr 转换为 RGB 然后再转换回 YCbCr 时,我经常会得到截然不同的值。有时一个值会相差超过 40。

我不确定这是为什么。我的印象是,可以通过 YCbCr 表示的颜色是 RGB 颜色的子集,但看起来这是完全错误的。 YCbCr 中是否有一些已知的颜色子集可以转换为 RGB,然后再恢复为原始值?

我用来转换的代码(基于 this site ):

def yuv2rgb(yuv):
  ret = []
  for rows in yuv:
    row = []
    for y, u, v in rows:
      c = y - 16
      d = u - 128
      e = v - 128
      r = clamp(1.164*c +           1.596*e, 16, 235)
      g = clamp(1.164*c - 0.392*d - 0.813*e, 16, 240)
      b = clamp(1.164*c + 2.017*d          , 16, 240)
      row.append([r, g, b])
    ret.append(row)
  return ret

def rgb2yuv(rgb):
  ret = []
  for rows in rgb:
    row = []
    for r, g, b in rows:
      y = int( 0.257*r + 0.504*g + 0.098*b + 16)
      u = int(-0.148*r - 0.291*g + 0.439*b + 128)
      v = int( 0.439*r - 0.368*g - 0.071*b + 128)
      row.append([y, u, v])
    ret.append(row)
  return ret

编辑:

我创建了这个问题的基本 3D 图。所有的点都是值差小于 10 的点。它构成了一个非常有趣的形状。 X为Cb,Y为Cr,Z为Y。

Each point is a YCbCr value that converts nicely to RGB and back

最佳答案

不,根本不是。 [上面讨论的所有内容都是针对 8 位的。]在全范围 R'G'B' 到有限范围 YCbCr 的情况下很明显(没有 bijection )。例如,您可以在这里进行测试:

https://res18h39.netlify.app/color

全范围 R'G'B' 值 238、77、45 被编码为带有 BT.601 矩阵的有限 YCbCr:在学校舍入后你将得到有限范围 120、90、201,但如果你将它舍入,你将在 R'G'B' 中获得 238、77、44。而 238、77、44 值将变为相同的值。哎呀。就是这样:游戏结束。

在全范围 RGB 到全范围 YCbCr 的情况下...... YCbCr 中有一些值为负 R'、G'、B'。 (例如,在有限范围内的 YCbCr BT.709 值 139、151、24 将是 RGB -21、182、181,只需转换为全范围 YCbCr。)再次说明,没有双射。

接下来,限制范围 R'G'B' 到限制范围 YCbCr...同样,没有双射。 YCbCr 中的黑色实际上是 16、128、128,而且只有这个。其他的16,x,y都不允许[在xvYCC里,不标准],而在R,G,B里,235,128,128都一样。当然前面的负数R'、G'、B'也适用。

从有限范围到全范围,我不知道。

关于colors - 将 YCbCr 转换为 RGB 是否可逆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32321631/

相关文章:

javascript - 如何在文档中找到所有数字并设置它们的样式?

java - 传递整数而不是资源颜色

colors - 如何为 Chart.js 工具提示标签设置颜色

algorithm - "Rounding"一小组颜色中最接近的颜色值

c++ - 将浮点值转换为 RGB 值

c++ - OpenInventor 到 PCD : cannot convert RGB to decimal

image - 如何在YUV 420半平面图像中应用单应性/ react 性?

java - 更改图像 RGB 值的 lsb 值给出不一致的值

python - 没有从 RGB 到 YUV 的转换

ffmpeg - 将 YUV420SP 转换为 YUV420P