gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:39:11 31 4
gpt4 key购买 nike

我想要一对转换算法,一个从 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/

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