01_YUV&RGB简介

YUV也可以用YCbCr 表示
Y表示亮度, U和V表示色度和饱和度。(亮度和颜色结合就是一个像素)

YUV是由RGB格式的数据转换得来:
Y = Y = 0.299 x R + 0.587 x G + 0.114 x B + 0
U = Cb = -0.169 x R - 0.331 x G + 0.499 x B + 128
V = Cr = 0.499 x R - 0.418 x G - 0.0813 x B + 128

RGB也可由YUV数据转换:
R = clamp(Y + 1.402 x (Cr - 128))
G = clamp(Y - 0.344 x (Cb - 128) - 0.714 x (Cr - 128))
B = clamp(Y + 1.772 x (Cb - 128))

//其中clamp函数是限定里面的值是在0-255之间 
int clamp(int val)
{
	if (val < 0)
		return 0;

	if (val > 255)
		return 255;

	return val;
}
RGB格式的数据转换成YUV格式不会压缩数据,数据大小是不变的,即原来RGB888, 转换成YUV也是各占8位

RGB32 每个像素用32位表示,RGB分量各使用8位(剩下的8位不用,若是ARGB则需要用到,A表示透明度)
RGB24 每个像素用24位表示,RGB分量各使用8位
RGB16 每个像素用16位表示,RGB分量都使用5位(剩下的1位不用)
一张 1280 * 720 大小的图片,就占用 1280 * 720 * 3 / 1024 / 1024 = 2.63 MB 存储空间


YUV444:
YUV的数据各占用8位,每个像素都由YUV组成
同一行的相邻4个像素数据: Y0U0V0 Y1U1V1 Y2U2V2 Y3U3V3
存储时: Y0 U0 V0, Y1 U1 V1, Y2 U2 V2, Y3 U3 V3 //即每个像素YUV的数据都会存放起来
4:4:4 , 意思就是4个像素里的数据有4个Y, 4个U, 4个V
一张 1280 * 720 大小的图片,就占用 1280 * 720 * 3 / 1024 / 1024 = 2.63 MB 存储空间

YUV422:
同一行的相邻4个像素数据: Y0U0V0 Y1U1V1 Y2U2V2 Y3U3V3
存储时: Y0 U0, Y1 V1, Y2 U2, Y3 V3 // 每两个相邻的像素, 一个丢弃V数据,一个丢弃U数据
还原时的YUV: [Y0U0V1] [Y1U0V1] [Y2U2V3] [Y3U2V3] //这样还原理论上会对图像的质量有影响的,但我们看不出来的.
4:2:2, 意思就是相邻的4个像素里有4个Y, 2个U, 2个V。 按上面存储的顺序也叫YUYV.
一张 1280 * 720 大小的图片,(1280 * 720 + 1280 * 720 * 0.5 * 2) / 1024 / 1024 = 1.76 MB

YUV420:
每一行的相邻两个像素与下一行同位置的两个像素数据差异不大,可以进一步的丢数据。
两行的像素数据:
Y00U00V00 Y01U01V01 Y02U02V02 Y03U03V03 …
Y88U88V88 Y89U89V89 Y90U90V90 Y91U91V91 …
存储时: Y00U00 Y01 Y02U02 Y03 //每个像素的Y数据保留, 两个像素数据只保留一个U数据。这一行不保留V数据(YUV: 420)
Y88V88 Y89 Y90V90 Y91 // … 两个像素数据只保留一个V数据, 这行不保留U数据(YUV: 402)
还原时只能相同位置的上下两行4个像素结合还原:
Y00U00V88 Y01U00V88 Y02U02V90 Y03U02V90
Y88U00V88 Y89U00V88 Y90U02V90 Y91U02V90
一张 1280 * 720 大小的图片,(1280 * 720 + 1280 * 720 * 0.25 * 2) / 1024 / 1024 = 1.32 MB

yuv数据还分成打包的,平面的
打包: yuv数据是顺序存放Y,接着U,再接着V数据存放。
平面: yuv数据是分成三个地方存放, 一个地方只存Y数据, 一个只存U数据, 一个只存V数据。通常叫法(例如yuv420p)


Y
只有灰度值没有色彩(黑白电视机)

UYVY(属于YUV422)
基于YUV422采样格式,采用打包格式进行存储,它的顺序和 YUYV 相反,先采样 U 分量再采样 Y 分量
存储时:
[U0 Y0 V1 Y1 ][U2 Y2 V3 Y3 ]
[U4 Y4 V5 Y5 ][U6 Y6 V7 Y7 ]

YUYV(属于YUV422)
基于YUV422采样格式,采用打包格式进行存储的,指每个像素点都采样 Y 分量,但是每隔一个像素采样它的 UV 分量。
存储时:
[Y0 U0 Y1 V1 ][Y2 U2 Y3 V3 ]
[Y4 U4 Y5 V5 ][Y6 U6 Y7 V7 ]


NV21 格式和 NV12 存储格式基本相同,只是 U V 存储位置互换。
NV12(属于YUV420sp类型)
是 iOS 中有的模式,它的存储顺序是先存 Y 分量,再 UV 进行交替存储。
存储时:
Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7
Y8 Y9 Y10 Y11 Y12 Y13 Y14 Y15
U0 V4 U2 V6 U8 V12 U10 V14
NV21(属于YUV420sp类型)
NV21 是 Android 中有的模式,它的存储顺序是先存 Y 分量,在 VU 交替存储。
存储时:
Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7
Y8 Y9 Y10 Y11 Y12 Y13 Y14 Y15
V4 U0 V6 U2 V12 U8 V14 U10


常见的yuv数据,每个像素的一个通道一般是占用一个字节即8bit。而HDR常用的标准HDR10,数据是10bit的。
每个像素的一个通道占用两个字节,其中6个bit是填充位,补0。

YUV420 10bitlE
10bit yuv420p 小端 格式。
YUV420 10bitBE
10bit yuv420p 大端 格式。
一个像素点8bit的Y数据转为10bit后的数据
8bit: 1001 0010
10bit: 0000 0010 0100 1000
在原来的基础上左移两位,后面补上两个0,这是实际的10bit数据,前面再补上6个0,是padding位。

一个可以播放10bit yuv流的播放器YUV Player

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值