本文主要是介绍HDR转SDR实践之旅(三)YUV420转YUV公式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
YUV420是什么
HDR转SDR的第一步是解码出10位YUV纹理,但是YUV会转成YUV420存储,渲染之前需还原成原始的YUV,本篇文章讲的就是如何用公式高效实现YUV420转YUV。如果你觉得有所收获,来给HDR转SDR开源代码点个赞吧,你的鼓励是我前进最大的动力。
人眼对Y亮度通道比起UV色度通道来更敏感,降低UV采样对图像影响不大从而减小视频大小,如上图所示左边是亮度通道,中间是色度通道,右边是亮度通道和色度通道合成的实际图像,第二行的YUV420色度通道减小采样后实际图像就变成右边的图像,实际操作中因为色度通道周围像素之间的差异很小,YUV420的实际图像和YUV的实际图像看起来差不多。
如上图所示UV通道横竖方向只采样一半数据,四个Y共用一对UV。颜色相同的YUV属于同一组,如下图所示上下左右的Y1、Y2、Y5、Y6共用U1、V1,而不是连续一行的Y1、Y2、Y3、Y4,这就是所谓两个方向采样一半的意思。根据UV存储顺序不一样,YUV420有四种格式i420、YV12、NV12、NV21,YUV420是从YUV中转换出来的,自然也能转换回去,常规方案是把YUV420的YUV通道拆成3个图像(Y图像U图像V图像)再组装成YUV,这种方式比较耗时其实可以省去YUV拆图像的步骤直接用YUV420算出YUV,注意以下公式针对YUV420的二维图像(一维图像同理)。
四种YUV420的区别
四种YUV420只是UV存储顺序不同,其他都一样。
YUV420格式 | 存储 | 区别 |
---|---|---|
i420 | Y+U+V | YUV3个通道都是分开的,U在V前面 |
YV12 | Y+V+U | YUV3个通道都是分开的,V在U前面 |
NV12 | Y+UV | Y通道是分开的,UV通道都是混合的,U在V前面 |
NV21 | Y+U+V | Y通道是分开的,UV通道都是混合的,V在U前面 |
YUV420转YUV公式
四种YUV420公式推导过程,如果看的时候糊涂不要沮丧,记住一个核心转换原则就是公式根据YUV420和YUV图像的位置关系推导,看不懂的时候可以根据画的YUV420和YUV图像自己推导。
i420转YUV
i420先放完所有U再放所有V(记法就是Y+U+V),U不一定占满整一行,如下图所示最后一个U9在整一行的中间,这也是为什么不直接用网上常见示意图解释的原因。
那么如何从i420图像转换出YUV图像呢?
定义: i420(x,y) 表示i420图像,YUV(x,y)表示YUV图像,x是横坐标,y是纵坐标,坐标从0开始计算
已知 i420(x,y),求YUV(x,y)
如下图所示YUV(5,2)就是粉红色方块的位置Y18U6V6
Y(5,2):i420(5,2)=Y18
U(5,2):i420(5,6)=U6
V(5,2):i420(2,8)=V6
实际操作过程中没有颜色可以直观来看,最终需要使用转换公式,其实就是算出YUV的 ( x , y ) (x,y) (x,y)坐标在i420图像中的对应位置。
$$
Y(x,y)=i420(?,?)\
U(x,y)=i420(?,?)\
V(x,y)=i420(?,?)\
$$
i420转YUV公式推理过程:
Y1-Y17红色线框横竖坐标采样一半得到是6个蓝色线框,与之对应U1-U6蓝色线框也刚好是6个,这说明U位于所有U的个数等于Y横竖坐标采样一半的个数。个数和坐标的关系很简单,横坐标就是个数除以宽的余数,纵坐标就是个数除以宽的商。U在所有YUV的个数还要在所有U的个数加上偏移量,U要加上偏移量 W ∗ H W * H W∗H(前面所有Y的个数),V同理也要加上偏移量 W ∗ H ∗ 5 / 4 W * H * 5 / 4 W∗H∗5/4(前面所有Y的个数加上所有U的个数)。
注意:
- i表示UV在各自通道第几个,U和V求的时候加上偏移量就是求UV在整个i420图像第几个
- 除2不保留小数的,不要以为除2再乘2没有变化
YV12转YUV
YV12就是i420的UV位置换了换,记法就是Y+V+U,V在前所以是YV12而不是YV21
公式不复述了,如下图
NV12转YUV
NV12的UV混在一起排列的其中U在前,记法就是Y+UV
上图红色的线长度相等,绿色的线长度刚好一半,这说明N12中U的横坐标和对应4个Y的第一个Y横坐标相等,U的纵坐标是Y纵坐标的一半加上YUV的高,V和U的关系就是横坐标加1就行
注意: 除2不保留小数的,不要以为除2再乘2没有变化
NV21转YUV
NV21就是NV12的UV位置换了换,记法就是Y+VU
公式不复述了,如下图
问题思考
下面3个问题留给大家思考
1.YUV420为什么叫YUV420,其中的0是什么意思?
2.怎么解决YUV420对齐中产生的绿边问题?
3.上述公式如何简化?
系列文章
- HDR转SDR实践之旅(一)流程总结
- HDR转SDR实践之旅(二)解码10位YUV纹理
- HDR转SDR实践之旅(三)YUV420转YUV公式
- HDR转SDR实践之旅(四)YUV转RGB矩阵推导
- HDR转SDR实践之旅(五)色域转换BT2020转BT709
- HDR转SDR实践之旅(六)传递函数与色差矫正
- HDR转SDR实践之旅(七)Gamma、HLG、PQ公式详解
- HDR转SDR实践之旅(八)色调映射
- HDR转SDR实践之旅(九)HDR开发资源汇总
- HDR转SDR实践之旅(十)SDR转HDR逆色调映射探索
这篇关于HDR转SDR实践之旅(三)YUV420转YUV公式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!