一文搞懂 RGB 与 YUV

色彩空间

色彩空间(Color Space)是指在三维空间中对颜色进行数学表示和描述的模型。它提供了一种标准化的方式来定义和区分不同的颜色,使得颜色可以被准确地捕捉、表示、转换和显示。常见的色彩模型包括 RGB、YUV、HSL 等等。

像素

屏幕画面是由一个一个像素组成,比如常见的 1920×1080,意思就是一行有 1920 个像素,有 1080 行,也就是一共有 1920 * 1080 = 2073600 个像素。而像素的表示通过色彩空间表示,比如 RGB,RGB 是由红绿蓝组成,通过混合红绿蓝,可以组合出很多不同的颜色。

image.png

RGB

RGB(红绿蓝)是一种常用的色彩模型,用于在电子显示设备上生成颜色。它是“加色法”模型的代表,意味着通过将红色、绿色和蓝色光的不同强度组合在一起,可以创造出各种颜色。

image.png

常见的 RGB 格式有:

格式描述每个像素分量位深度示例用途
RGBARGB 格式外加一个透明度分量(Alpha),用于表示像素的透明度。R、G、B、A各自为一个字节32位(8位×4)图像编辑、视频处理、Web 图形
ARGB类似于 RGBA,但 Alpha 通道在最前面。A、R、G、B32位(8位×4)Windows 系统中的图像处理、图形渲染
BGRA类似于 RGBA,但颜色通道顺序为蓝色、绿色、红色,Alpha 在最后。B、G、R、A32位(8位×4)图像处理、视频编解码、游戏开发
RGB565RGB 格式的压缩版本,其中红色用 5 位、绿色用 6 位、蓝色用 5 位存储。5位红色、6位绿色、5位蓝色16位(5+6+5)嵌入式系统、低带宽图像显示、显示屏驱动
RGB888又叫做 True Color,即每个颜色分量占 8 位,共 24 位,通常用于高质量显示。R、G、B各自为 8 位24位(8位×3)高清显示器、图像处理、视频渲染
RGB101010每个分量使用 10 位存储,常用于需要更高色彩精度的显示或图像处理。R、G、B各自为 10 位30位(10位×3)高动态范围(HDR)图像处理、电影制作
RGB121212每个分量使用 12 位存储,用于专业级图像处理,提供更精细的色彩表达。R、G、B各自为 12 位36位(12位×3)高动态范围(HDR)图像制作、专业摄影
RGBF32使用浮点数存储每个颜色分量,适用于需要极高精度的图像处理。R、G、B各自为 32 位浮点数96位(32位×3)科学计算、图像编辑、专业渲染

YUV

YUV 代表亮度(Y)、蓝色亮度(U)和红色亮度(V)。它主要用于模拟视频信号。YUV 的发明源于工程师们希望在黑白基础设施中实现彩色电视。他们需要一种既能兼容黑白电视又能添加色彩的信号传输方法。亮度分量作为黑白信号已经存在;他们在此基础上增加了 UV 信号作为解决方案。

下图为上世纪80年代的黑白电视机

image.png

UV 表示法之所以被选作色度的表示方式,而非直接使用 R 和 B 信号,是因为 U 和 V 是色差信号。换言之,U 和 V 信号指示电视在不改变某点亮度的前提下调整其颜色。或者,U 和 V 信号告诉显示器通过牺牲另一种颜色来使某一颜色更亮,并指示应调整的程度。U 和 V 值越高(或负值时越低),该点的色彩饱和度(即鲜艳度)就越强。U 和 V 值越接近零,颜色调整的幅度就越小,这意味着红、绿、蓝三色光将更加均匀地亮起,从而产生一个更灰的点。这就是使用色差信号的好处,即不是直接告诉颜色中有多少红色,而是指示它比绿色或蓝色多出多少红色。

image.png

下图为 YUV 与 RGB 的对比

image.png

应用

YUV色彩空间在许多视频相关的领域中得到广泛应用:

  1. 视频压缩和编码:视频压缩算法(如MPEG、H.264、HEVC等)通常使用YUV色彩空间。这是因为亮度和色度信息可以分开压缩,且Y分量的压缩对视觉效果影响较小。许多视频格式(如MP4、AVI)也使用YUV作为色彩空间。
  2. 电视广播:传统的电视广播(如PAL、NTSC)和数字电视系统常常使用YUV色彩空间。特别是在电视信号处理中,YUV有助于区分亮度信息和色彩信息,便于对信号进行传输和处理。
  3. 视频传输和处理:YUV是视频信号传输的标准格式,许多数字视频接口(如HDMI、VGA)以及视频处理设备都支持YUV信号。
  4. 图像处理:在图像处理领域,YUV也被用来进行色彩调整、色调映射、色彩增强等操作。通过分离亮度和色度,可以更精确地调整图像的细节和颜色。

色度子采样(Chroma Subsampling)

色度子采样是一种通过降低色度信息的分辨率而非亮度信息来编码图像的技术,利用了人眼视觉系统对颜色差异的敏感度低于对亮度差异的特点,这种方法在不显著影响画面质量的前提下降低了带宽需求。这使得在有效减少文件大小(最多可达 50%)的同时,保持图像清晰度。在 YUV 格式中,亮度仅占信号的 1/3,因此减少色度数据量有很大帮助。

YUV 4:4:4

全彩深度通常称为 4:4:4。第一个 4 表示每个像素都有一个亮度分量(Y),第二个 4 表示每个像素都有一个 U 色度分量,第三个 4 表示每个像素都有一个 V 色度分量。由于每个像素都有对应的 Y、U、V 值,因此没有任何压缩或子采样。

image.png

YUV 4:2:2

4:2:2,第一个 4 表示每个像素都有一个亮度分量(Y),第二个 2 表示每两个像素共享一个 U 色度分量,第三个 2 表示每两个像素共享一个 V 色度分量。

image.png

4:2:2 相比 4:4:4 减少了色度信息的存储需求,但亮度信息(Y)没有压缩,因此仍能保持较高的图像质量。色度信息的采样率是亮度的50%,这使得图像总带宽减少了 33%。

YUV 4:2:0

4:2:0 表示第一个 4 表示每个像素都有一个亮度分量(Y),第二个 2 表示每两个像素共享一个 U 色度分量,第三个 0 表示每四个像素共享一个 V 色度分量(即每两个像素共享一个色度分量)。

image.png

4:2:0 格式大大压缩了色度信息的采样频率,减少了数据量,整体图像带宽减少了 50%。由于人眼对亮度信息更为敏感,而对色度的敏感度较低,因此这种采样方式在视觉效果上对大部分观众影响不大,但能显著降低存储空间和带宽需求。

image.png
下表为常见的 YUV 格式

格式描述位深度示例用途
YUV420Y分量、U分量、V分量的采样率为4:2:0,即每4个Y采样点对应1个U和1个V采样点8位、10位等视频压缩(如H.264、HEVC),视频流传输
YUV422Y分量、U分量、V分量的采样率为4:2:2,即每2个Y采样点对应1个U和1个V采样点8位、10位等高清视频传输,数字电视广播
YUV444Y分量、U分量、V分量的采样率为4:4:4,即每个Y采样点都有一个对应的U和V采样点8位、10位、12位等专业视频编辑,色彩精度要求较高的应用
YUV420PYUV420的平面存储格式,每个分量(Y、U、V)分开存储8位、10位等视频压缩(如H.264、HEVC)
YUV422PYUV422的平面存储格式,每个分量(Y、U、V)分开存储8位、10位等高清视频传输
YUV444PYUV444的平面存储格式,每个分量(Y、U、V)分开存储8位、10位、12位等高质量图像和视频处理
YUV420SPYUV420的半平面存储格式,U和V共享同一平面,交替排列8位、10位等移动设备、硬件编码(如MPEG-4、H.264)
NV12YUV420的半平面格式,Y分量单独存储,UV分量交替存储8位、10位等视频编码、硬件加速(如H.264、HEVC)
NV21YUV420的半平面格式,Y分量单独存储,VU分量交替存储8位、10位等视频编码、硬件加速(如H.264、HEVC)
YUV422SPYUV422的半平面格式,U和V分量共享同一平面,交替存储8位、10位等高清视频传输、数字电视
YUV444SPYUV444的半平面格式,U和V分量共享同一平面,交替存储8位、10位、12位等高质量视频处理、视频编码

RGB 与 YUV 的互转公式

RGB 转 YUV:

  • Y = 0.299R + 0.587G + 0.114B
  • U = 0.492 (B-Y)
  • V = 0.877 (R-Y)

YUV 转 RGB

  • R = Y + 1.140V
  • G = Y - 0.395U - 0.581V
  • B = Y + 2.032U
参考资源链接:[Android Camera2:无预览获取原始数据及自定义处理](https://wenku.csdn.net/doc/2x06gi8c8f?utm_source=wenku_answer2doc_content) 掌握Android Camera2 API来实现手动控制摄像头预览并获取原始数据,对于希望深入理解相机操作和图像处理的开发者来说,是一项必备技能。《Android Camera2:无预览获取原始数据及自定义处理》一文将为你提供全面的指导。 在手动控制摄像头预览并获取YUV格式原始数据的过程中,以下步骤是关键: 1. **权限请求**:确保你的应用拥有访问摄像头的权限,包括`CAMERA`和`WRITE_EXTERNAL_STORAGE`。 2. **CameraDevice的获取**:通过CameraManager获取CameraDevice,并打开CameraDevice以进行操作。 3. **配置CaptureRequest**:创建一个CameraCaptureSession,并通过CaptureRequest设置摄像头的各种参数,如分辨率、格式等。 4. **创建ImageReader实例**:初始化ImageReader,注册一个ImageListener用于处理摄像头捕获到的每一帧数据。ImageReader需要设置为接收YUV_420_888格式的数据。 5. **预览控制**:如果需要手动控制预览,可以在创建CameraCaptureSession时发送一个仅包含ImageReader的请求,这样不会显示预览,但可以接收原始数据流。 6. **YUVRGB的转换**:使用libyuv等库将YUV数据转换为RGB格式,以便进一步处理或显示。 7. **图像处理保存**:将转换后的RGB数据转换为Bitmap,可以用于显示或者保存到存储设备。 通过以上步骤,你将能够实现对摄像头的精细控制,并获取到用于自定义处理的原始数据流。值得注意的是,在Android开发中处理图像数据时,性能优化是一个不可忽视的因素。了解和应用合适的数据处理库,如libyuv,将有助于提高应用性能。进一步深入了解图像数据处理和存储的机制,建议阅读《Android Camera2:无预览获取原始数据及自定义处理》这篇资料。 参考资源链接:[Android Camera2:无预览获取原始数据及自定义处理](https://wenku.csdn.net/doc/2x06gi8c8f?utm_source=wenku_answer2doc_content)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值