我想要一对转换算法,一个从 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 许可协议
是的,存在可逆变换。
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 代码,在我的评论中提到。