是的,可逆变换是存在的。
equasys 有限公司 https://web.archive.org/web/20180423091842/http://www.equasys.de/colorconversion.html发布了从 RGB 到 YUV、YCbCr 和 YPbPr 的可逆转换,并解释了每种转换适用于哪种情况、此钳位的真正含义以及参考链接。 (就像一个很好的答案。)
对于我自己的应用程序(jpg 图像,而不是模拟电压),YCbCr 是合适的,所以我为这两个转换编写了代码。事实上,对于许多图像来说,来回值的差异不到 256 分之一;并且前后图像在视觉上无法区分。
PIL的色彩空间转换YCbCr -> RGB https://stackoverflow.com/questions/7041172/pils-colour-space-conversion-ycbcr-rgb?rq=1因提及 equasis 网站而获得荣誉。
其他答案无疑可以提高 equasys 的精度和简洁性:
https://code.google.com/p/imagestack/ 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;
}