YUV色彩空间与色度抽样技术解析

图像处理领域,尤其是使用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数据,是时候应用色度抽样了。色度抽样的相关信息如下所示:

色度抽样:

  • 4:4:4 - 对于每个像素,Cr和Cb都是每个像素。
  • 4:4:0 - 对于每个像素,Cr和Cb是交替行的每个像素。
  • 4:2:2 - 对于每个像素,Cr和Cb是交替列的每个像素。
  • 4:2:0 - 对于每个像素,Cr和Cb是交替列和行的每个像素。
  • 4:1:1 - 对于每个像素,Cr和Cb是每第四列的每个像素。
  • 4:1:0 - 对于每个像素,Cr和Cb是每第四列和行的每个像素。

有关更详细的信息,请阅读以下链接:

[链接]

可以通过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();
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485