五、YUV与RGB对比介绍

本文详细介绍了RGB和YUV两种颜色编码方式,包括它们的原理、优缺点以及转换公式。RGB编码适用于彩色图像,占用较多带宽;YUV编码则用于优化传输,节省频宽并兼容黑白电视。还给出了BT.601和BT.709标准下的转换公式,并以YUV422的YUYV格式为例展示了从RGBA到16进制YUV值的转换过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、编码介绍

1.1 RGB 编码

RGB 图像中,每个像素点都有红、绿、蓝三个基底颜色,将 RGB 分别取不同的值,就会展示不同的颜色。标准的RGB 编码,每个基底颜色都占据 8 bit位,也就是一个字节(0-255),所以一个像素点占据了 8 * 3 = 24 bit位,也就是三个字节。例如一张 1920 * 1080大小的图片,就代表着它有 1920 * 1080 个像素点,其中每个像素点都采用 RGB 编码,那么这张图片的存储空间就是:1920 * 1080 * 3 / 1024 / 1024 = 5.93 MB 存储空间。

考虑到带宽限制,也有16bit的RGB,R和B用5bit表示,G用6bit表示(因为人眼对绿色更敏感)。常见的RGB格式有RGB888,RGB565,RGB555,RGB24,RGB32(每个分量8比特,剩余8位空着),ARGB32(每个分量8比特,Alpha通道值8bit)等。

RGB的存储格式通常为BGRBGRBGR的顺序。Bitmap就是在RGB像素数据上加上数据头形成的文件格式。

1.2 YUV 编码

在本专栏第一节 一、YUV图像基础 已经大致讲过YUV编码基础。对于 YUV 图像来说,并不是每个像素点都需要包含了 Y、U、V 三个分量,根据不同的采样格式,可以每个 Y 分量都对应自己的 UV 分量,也可以几个 Y 分量共用 UV 分量。

1.3 RGB和YUV的优缺点

  1. YUV主要用于优化彩色视频信号的传输,与RGB视频信号传输相比占用极少的频宽(RGB要求三个独立的视频信号同时传输)

  2. YUV的亮度信号Y和色度信号U、V是可以分离的。如果只有Y信号分量而没有U、V分量,那么这样表示的图像就是黑白灰度图像,这样就做到了对黑白电视机的兼容

二、转换公式

2.1 BT.601标准

2.1.1 Limited Range

	Y=16+((66*R+129*G+25*B+128)>>8)
	Cb=128+((-38*R-74*G+112*B+128)>>8)
	Cr=128+((112*R-94*G-18*B+128)>>8)

RGB值要归一化到0-255区间

	R=(298*(Y-16)+409*(Cr-128)+128)>>8
	G=(298*(Y-16)-100*(Cb-128)-208*(Cr-128)+128)>>8
	B=(298*(Y-16)+516*(Cb-128)+128)>>8

2.1.2 Full Range

	Y=((77*R+150*G+29*B+128)>>8)
	Cb=128+((-43*R-85*G+128*B+128)>>8)
	Cr =128+((128*R-107*G-21*B+128)>>8)

RGB值要归一化到0-255区间

	R=(Y+359*(Cr-128)+128)>>8
	G=(Y-88*(Cb-128)+183*(Cr-128)+128)>>8
	B=(Y+454*(Cb-128)+128)>>8

2.2 BT.709标准

2.2.1 Limited Range

	Y=16+((47*R+157*G+16*B+128)>>8)
	Cb=128+((-26*R-87*G+112*B+128)>>8)
	Cr=128+((112*R-102*G-10*B+128)>>8)

RGB值要归一化到0-255区间

	R=(298*(Y-16)+459*(Cr-128)+128)>>8
	G=(298*(Y-16)-55*(Cb-128)-137*(Cr-128)+128)>>8
	B=(298*(Y -16)+541*(Cb-128)+128)>>8

2.2.2 Full Range

	Y=((55*R+183*G+19*B+128)>>8)
	Cb=128+((-30*R-101*G+130*B+128)>>8)
	Cr=128+((130*R-119*G-12*B+128)>>8)

RGB值要归一化到0-255区间

	R=(Y +394*(Cr-128)+128)>>8
	G=(Y-47*(Cb-128)-118*(Cr-128)+128)>>8
	B=(Y+465*(Cb-128)+128)>>8

三、RGBA到16进制YUV值

以YUV422的YUYV格式、BT.601标准的Limited Range为例

#include <stdlib.h>
#include <stdio.h>

int main()
{
	unsigned int r = 255;
	unsigned int g = 0;
	unsigned int b = 0;
	int y, u, v;
	unsigned long yuyv;
	y = ((66 * r + 129 *g + 25 * b +128) >> 8) + 16;
	u = ((128 - 38 * r - 74 * g + 112 * b) >> 8) + 128;
	v = ((112 * r - 94 * g - 18 * b + 128) >> 8) + 128;
	yuyv = v << 24 | y << 16 | u << 8 | y;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值