如何转换 RGB -> YUV -> RGB(双向)

新手上路,请多包涵

我想要一对转换算法,一个从 RGB 到 YUV,另一个从 YUV 到 RGB,它们是互逆的。也就是说,往返转换应该保持该值不变。 (如果愿意,可以将 YUV 替换为 Y’UV、YUV、YCbCr、YPbPr。)

这样的事情存在吗?如果是这样,它是什么?

发布的解决方案( 如何在 C/C++ 中执行 RGB->YUV 转换?http://www.fourcc.org/fccyvrgb.php,http : //en.wikipedia.org/wiki/YUV )只是逆向的(当省略对 [0,255] 的钳位时,两个 3x3 矩阵是逆矩阵。但是省略该钳位会允许出现负亮度之类的事情,这会对 YUV 空间中的图像处理造成严重破坏。保留钳位会使转换非线性,这使得定义逆变得棘手。

原文由 Camille Goudeseune 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 838
2 个回答

是的,存在可逆变换。

equasys GmbH 发布了从 RGB 到 YUV、YCbCr 和 YPbPr 的可逆转换,并解释了每种情况适用于哪种情况、这种钳制的真正含义以及参考链接。 (就像一个很好的答案。)

对于我自己的应用程序(jpg 图像,而不是模拟电压)YCbCr 是合适的,所以我为这两个转换编写了代码。事实上,对于许多图像,在 256 中反复出现的值相差不到 1 分;前后图像在视觉上无法区分。

PIL 的色彩空间转换 YCbCr -> RGB 因提及 equasys 的网页而受到赞誉。

其他答案,可能会提高 equasys 的精度和简洁性:

  • https://code.google.com/p/imagestack/ 包括 rgb_to_x 和 x_to_rgb 函数,但我没有尝试编译和测试它们。

  • Cory Nelson 的答案链接到具有类似功能的代码,但它说一般情况下不可能进行反转,这与 equasys 相矛盾。

  • FFmpeg、OpenCV、VLFeat 或 ImageMagick 的源代码。

2019 年编辑: 这是来自 github 的 C 代码,在我的评论中提到。

 void YUVfromRGB(double& Y, double& U, double& V, const double R, const double G, const double B)
{
  Y =  0.257 * R + 0.504 * G + 0.098 * B +  16;
  U = -0.148 * R - 0.291 * G + 0.439 * B + 128;
  V =  0.439 * R - 0.368 * G - 0.071 * B + 128;
}
void RGBfromYUV(double& R, double& G, double& B, double Y, double U, double V)
{
  Y -= 16;
  U -= 128;
  V -= 128;
  R = 1.164 * Y             + 1.596 * V;
  G = 1.164 * Y - 0.392 * U - 0.813 * V;
  B = 1.164 * Y + 2.017 * U;
}

原文由 Camille Goudeseune 发布,翻译遵循 CC BY-SA 4.0 许可协议

一旦你夹紧,你就完成了。它们变成不同的颜色,你不能回去。如果您愿意,我已经编写了一些我自己的代码来 在所有这些和更多之间进行转换,但这无助于将钳位颜色反转回其原始颜色。

原文由 Cory Nelson 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题