在图像处理领域,尤其是使用C++进行图像处理的开发者,RGB到YUV的转换和色度抽样技术是两个非常基础且重要的概念。虽然互联网上有许多文章解释了这些转换背后的逻辑和理论,但很难找到使用不同色度抽样方案的C++代码示例。需要注意的是,本文提供的代码并非健壮的代码,如果打算将其用于项目,请根据自己的技能进行重写。
根据维基百科的解释,YUV是一种通常用作彩色图像处理流程中的色彩空间。它在编码彩色图像或视频时考虑了人类的视觉感知,允许减少色度分量的带宽,从而使传输错误或压缩伪影比使用“直接”的RGB表示更容易被人类视觉所掩盖。
简而言之,YUV是一种图像压缩技术或图像压缩技术的一部分,它省略了人类眼睛无法察觉的一些图像细节。在YUV中,Y代表图像的亮度或光强度;U和V是色度分量。在图像压缩过程中,不能省略任何亮度[Y]信息,但可以根据色度抽样方案省略一些颜色或色度分量。
色度抽样是衡量YUV压缩的一种方式。可以根据需求选择不同的色度抽样方案。
在继续阅读下文之前,应该确保对YUV色彩空间有更好的理解。
将RGB转换为YUV是一个简单的算术过程。公式基于红色、绿色和蓝色对亮度和色度因素的相对贡献。根据不同的目标显示器,有几种不同的公式在使用。本文选择了ITU-R版本的公式。
RGB到YUV的转换公式如下:
Y = 0.299 * R + 0.587 * G + 0.114 * B
U = -0.1687 * R - 0.3313 * G + 0.5 * B + 128
V = 0.5 * R - 0.4187 * G - 0.813 * B + 128
YUV到RGB的转换公式如下:
R = Y + 1.13983 * V
G = Y - 0.39465 * U - 0.58060 * V
B = Y - 0.03211 * U + 0 * V
现在有了YUV数据,是时候应用色度抽样了。色度抽样的相关信息如下所示:
色度抽样:
有关更详细的信息,请阅读以下链接:
[链接]
可以通过GUI中相应的组合框选择不同的色度抽样和图像视图。
根据色度抽样,重建的图像可能会有一些小错误,如图中所示(它使用了色度抽样4:1:0),可以应用一些过滤方法来增强图像。
RGB到YUV的转换发生在RGBtoYUV类中。RGBtoYUV类中可用的方法如下:
bool ConvertRGBtoYUV(byte* pbyData_i, int nWidth_i, int nHeight_i, CString csChromaSampling_i);
byte* GetYData();
byte* GetCbData();
byte* GetCrData();
byte* ConvertYUVtoRGB();