博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
YUV420转YUV444 , YUV420转RGB
阅读量:2383 次
发布时间:2019-05-10

本文共 951 字,大约阅读时间需要 3 分钟。

我想大家应该知道了YUV的颜色表示原理即:

  Y = 0.299R + 0.587G + 0.114B 

  U = -0.147R - 0.289G + 0.436B 
  V = 0.615R - 0.515G - 0.100B 
  R = Y + 1.14V 
  G = Y - 0.39U - 0.58V 
  B = Y + 2.03U

如果通过上面的公式从RGB转换成YUV的话,得出的YUV一帧图片和RGB一样大(如果都用8bit表示一个像素分量值)

而YUV采样格式有: YUV 4:4:4 YUV 4:2:2 YUV 4:2:0  等

我就介绍下YUV4:2:0采样怎么转换成YUV4:4:4

YUV444示意图(4*4大小):4*4大小的图中每个像素都对应三个YUV分量,如下图。所占空间为 4*4*3=48 bytes  

Y分量(YUV444)
       
       
       
       
U分量(YUV444)
       
       
       
       
V分量(YUV444)
       
       
       
       

YUV4:2:0 采样方式为: U分量和V分量隔行采样, 同时UV分量在其采样行也是隔行采样

Y分量
Y00 Y01 Y02 Y03
Y10 Y11 Y12 Y13
Y20 Y21 Y22 Y23
Y30 Y31 Y32 Y33
U分量
U00    ?     U02   ?    
? ? ? ?
U20 ? U22 ?
? ? ? ?
V分量
? ?        ? ?       
V10 ? V12 ?
? ? ? ?
V30 ? V32 ?

从上面的比较可知,要将YUV420转换成YUV444的关键就在于插值到采样的缺口处。大家GOOGLE下图像的放大缩小的插值方法原理 :最近邻插值法,双线性插值法和三次插值法

这里我们介绍使用双线性插值法(只给出算法,原理自己GOOGLE):

  • 对U分量进行插值 从上面可知  U00 U02 U20 U22是已知的:

U01 = (U00 + U02)/2;

U10 = (U00 + U20)/2;

U11 = (U00 + U02 + U20 + U22)/4;

剩下的也采用此种方法计算即可。  (当然了对于边缘的点如U30~U33, U03~U33的处理可以直接用邻近的点代替)

  • 对V变量的插值处理也是一样. 
  • 不过呢,我看的几个3D合成视图的软件中直接用的邻近的值代替的.应该说也差不多

转载地址:http://anuab.baihongyu.com/

你可能感兴趣的文章
Longest Substring Without Repeating Characters
查看>>
Median of Two Sorted Arrays
查看>>
Search for a Range
查看>>
罗马数字与阿拉伯数字的相互转化
查看>>
3Sum
查看>>
Next Permutation
查看>>
sys文件系统
查看>>
Mysql常用命令大全
查看>>
Linux内核中C编程生僻用法(GNU C)
查看>>
辞职后五险一金怎么处理?
查看>>
几种开源的TCP/IP协议栈对比
查看>>
C语言之断言
查看>>
程序员技术练级攻略
查看>>
#define
查看>>
C语言之if...else PK switch...case
查看>>
关于SVN方面的问题
查看>>
深入理解C语言
查看>>
编程成就:开发人员如何升级
查看>>
如何防止代码腐烂
查看>>
va_start va_end 的使用和原理
查看>>