基础概念
RGB 和 YUV 都属于一种颜色编码方式,或者说颜色空间。
RGB 色彩模式是工业界的一种颜色标准,是通过对红、绿、蓝三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB 即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。
在 YUV 空间中,Y 代表亮度,其实 Y 就是图像的灰度值;UV 代表色差,U 和 V 是构成彩色的两个分量。在现代彩色电视系统中,通常采用三管彩色摄影机或彩色 CCD 摄影机进行取像,然后把取得的彩色图像信号经分色、分别放大校正后得到 RGB,再经过矩阵变换电路得到亮度信号 Y 和两个色差信号 B–Y(即 U)、R–Y(即 V),最后发送端将亮度和色差三个信号分别进行编码,用同一信道发送出去。这种色彩的表示方法就是所谓的 YUV 色彩空间表示。
解析
RGB 格式
RGB16
RGB16 数据格式主要有二种:RGB565 和 RGB555。
RGB565,每个像素用 16 比特位表示,占 2 个字节,RGB 分量分别使用 5 位、6 位、5 位。
//获取高字节的5个bit
R = color & 0xF800;
//获取中间6个bit
G = color & 0x07E0;
//获取低字节5个bit
B = color & 0x001F;
RGB555,每个像素用 16 比特位表示,占 2 个字节,RGB 分量都使用 5 位 (最高位不用)。
//获取高字节的5个bit
R = color & 0x7C00;
//获取中间5个bit
G = color & 0x03E0;
//获取低字节5个bit
B = color & 0x001F;
RGB24
RGB24 图像每个像素用 24 比特位表示,占 3 个字节,注意:在内存中 RGB 各分量的排列顺序为:BGR BGR BGR。
RGB32
RGB32 图像每个像素用 32 比特位表示,占 4 个字节,R,G,B 分量分别用 8 个 bit 表示,存储顺序为 B,G,R,最后 8 个字节保留。注意:在内存中 RGB 各分量的排列顺序为:BGRA BGRA BGRA ……。
本质就是带 alpha 通道的 RGB24,与 RGB32 的区别在与,保留的 8 个 bit 用来表示透明,也就是 alpha 的值。
R = color & 0x0000FF00;
G = color & 0x00FF0000;
B = color & 0xFF000000;
A = color & 0x000000FF;
YUV 采样
- YUV444:一个像素就有 YUV 三个值,和 RGB 类似;一个 YUV 占 8+8+8 = 24bits 3 个字节。
- YUV422:第一个像素有 YUV 三个值,第二个像素只有 Y,与前一个像素共用 UV;一个 YUV 占 8+4+4 = 16bits 2 个字节。
- YUV420:上下四个像素共用一个 UV。一个 YUV 占 8+2+2 = 12bits 1.5 个字节。
转换
YUV2RGB
$$ R = Y + 1.403 \times (V-128)\ G=Y-0.343 \times (U-128) - 0.714 \times (V-128)\ B=Y + 1.770 \times (U-128) $$
RGB2YUV
$$ Y = 0.299 \times R + 0.587 \times G + 0.114 \times B\ U = -0.169 \times R - 0.331 \times G + 0.500 \times B + 128\ V = 0.500 \times R - 0.419 \times G - 0.081 \times B + 128\ $$
浮点型运算比较耗时,将所有运算换成位运算,提高效率。具体推倒过程见色彩转换系列之 RGB 格式与 YUV 格式互转原理及实现_小武的博客-CSDN 博客_rgb yuv
Y= ((R << 6) + (R << 3) + (R << 2) + R + (G << 7) + (G << 4) + (G << 2) + (G << 1) + (B << 4) + (B << 3) + (B << 2) + B) >> 8
U= (-((R << 5) + (R << 3) + (R << 1)+ R) - ((G << 6) + (G << 4) + (G << 2)+G) + (B << 7) + 32768) >> 8
V= ((R << 7) - ((G << 6) + (G << 5) + (G << 3) + (G << 3) + G) - ((B << 4) + (B << 2) + B) + 32768 )>> 8
参考
RGB 和 YUV - 简书 颜色空间 YUV 简介_网络资源是无限的-CSDN 博客_yuv 颜色空间 图解 RGB565、RGB555、RGB16、RGB24、RGB32、ARGB32 等格式的区别_handy 周-CSDN 博客_rgb565 图解 YU12、I420、YV12、NV12、NV21、YUV420P、YUV420SP、YUV422P、YUV444P 的区别_handy 周-CSDN 博客_yv12