【C语言】之深入探讨 yuv 之间的关系和转换

YUV信号:

准确来说,YUV是一种颜色编码方法,而yuv信号是由RGB经过矩阵变换电路(先不用去理它是如何转换的)得到的亮度信号Y和两个色差信号U(blue-Y)、V(red-Y)


屏幕分辨率:

我们经常说屏幕的分辨率:1204x768 等,指的是整个屏幕的有768行像素,每行有1024个像素,如果图像像素为RGB格式(准确来说是RGB888:表示R、G、B各占8个比特位)的话:每个像素由R(red)、G(green)、B(blue)构成,R、G、B各占一个字节,所以一个像素需要3个字节空间,整个屏幕算下来需要:1024x768x3 这么多个字节空间来存储。同理 yuv:每个像素由 Y、U、V构成, Y、U、V 同样各占一个字节。


yuv444:

'444’可以理解为:每四个像素里 y、u、v 的个数比例为 4:4:4,看一下下面四个像素点:

[y0u0v0] [y1u1v1] [y2u2v2] [y3u3v3] // 注意下标由0开始计数

注意这里的每个像素的 y、u、v 都是完整的!

再来看一下 yuv422(相信大家应该知道其含义了吧:每四个像素里 y、u、v 的个数比例为 4:2:2),就是说yuv422四个像素里是这样构成的:

[y0u0--] [y1--v1] [y2u2--] [y3--v3] // '-'表示缺省值

第一个像素点去掉 u,第二个像素点去掉 v,下一个像素点去掉 u,再下一个像素点去掉v,以此类推;这里,就有人会问了,这样不就会存在色差吗?当然,肯开会存在色差的,但并不明显,一般人眼是无法分辨出来。


映射像素点

什么是映射?为什么要映射?我们知道,要构成一个像素点,对于yuv格式来说,必须要y、u、v来组成。那么对于缺掉u、v的yuv422来说,想要构成完整的yuv就要相邻两个像素之间互相共用,比如:

[y0u0--] [y1--v1] 两个像素映射出来就是:[y0u0v1] [y1u0v1]
[y2u2--] [y3--v3] 两个像素映射出来就是:[y2u2v3] [y3u2v3]

第一个像素点共用下一个像素掉的v,第二个像素点的共用前一个像素掉的u;


yuv420:

那什么又是yuv420呢?yuv420可不是每四个像素之间y、u、v的个数比例为:4:2:0,它比较复杂一点,因为它是在yuv422基础上然后按照一行一行来取舍的:一行去掉u,一行去掉v。也就是说:假如,第一行全部u去掉,那么第二行的v就全部去掉,而再下一行的u全部去掉,像素存放像下面这样:

yuv444:
第一行:[y00u00v00] [y01u01v01] [y02u02v02] [y03u03v03] [y04u04v04] [y05u05v05]
第二行:[y06u06v06] [y07u07v07] [y08u08v08] [y09u09v09] [y10u10v10] [y11u11v11]
yuv422:
第一行:[y00u00---] [y01---v01] [y02u02---] [y03---v03] [y04u04---] [y05---v05]
第二行:[y06---v06] [y07u07---] [y08---v08] [y09u09---] [y10---v10] [y11u11---]
yuv420:
第一行:[y00u00---] [y01------] [y02u02---] [y03------] [y04u04---] [y05------]
第二行:[y06---v06] [y07------] [y08---v08] [y09------] [y10---v10] [y11------]
以此类推下去......

yuv420反推其映射像素点

既然yuv420是以行来处理的,那么映射时就是相邻两行每两个像素之间来互相共用u、v,比如这样:

yuv420:
第一行:[y00u00---] [y01------] [y02u02---] [y03------] [y04u04---] [y05------]
第二行:[y06---v06] [y07------] [y08---v08] [y09------] [y10---v10] [y11------]

映射为:

第一行:[y00u00v06] [y01u00v06] [y02u02v08] [y03u02v08] [y04u04v10] [y05u04v10]
第二行:[y06u00v06] [y07u00v06] [y08u02v08] [y09u02v08] [y10u04v10] [y11u04v10]

映射原理是这样的:一行的两个像素点和相邻下一行的相同位置的两个像素点之间u、v共用,是不是有点晕-_-,打个比方说:第一行的第一二个像素点,和第二行的第一二个像素点(必须是第一二个)之间只会存在一个 u, 一个 v,所以像素点间缺什么就补什么。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值