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

标签 c++ c rgb yuv bidirectional

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

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

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

最佳答案

是的,存在可逆变换。

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

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

PIL's colour space conversion 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;
}

关于c++ - 如何转换 RGB -> YUV -> RGB(双向),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17892346/

相关文章:

c++ - 将 C 库与 C++ 链接

c - 返回 char* 以在 C 中打印

python - 如何用每个像素的 RGB 值构建图像

C++ : Check if the template type is one of the variadic template types

c++ - 从 C++ 中的文件加载的数组中获取输出

c - 在 Windows 上将 select() 与 STDIN 一起使用?

android - 使用 Android Camera 进行图像处理

在 C__ 中将 PPM 从 RGB 转换为 HSL

c++ - if constexpr 和语法错误 'type'

c - Make 仅运行 'gcc',不带任何参数