帧间运动是基于视频亮度(luma)不发生改变的一个假设,而在视频序列中经常能遇到亮度变化的场景,比如淡入淡出、镜头光圈调整、整体或局部光源改变等,在这些场景中,简单帧间运动补偿的效果可想而知(实际编码中遇到亮度变化的宏块,R-D模型的最后结果通常都是用帧内预测编码),加权预测的提出就是为 了应对亮度变化的场景。

在h.264中两种预测模式:显示模式(explicit mode)与隐式模式(implicit mode),另外还有一种默认预测模式,不过这相当于不进行预测。

P帧与B帧都有显式模式,隐式模式只有B帧适用。至于怎么区分两种模式,简单来说,显式模式,需要在片头中传输权重(weight),而隐式模式则不需要。

加权预测可以分为三个步骤:

  1. 亮度变化检测。一般是用阈值判断亮度是否发生变化。
  2. 确定权重与偏移。就目前来说,用的都是简单的加权预测算法,这步是跟亮度变化检测连在一起的,因为是用权重来判断亮度是否发生了变化。
  3. 亮度补偿,把参考帧通过权重与偏移的线性补偿得到加权参考帧。

显式模式

对于显式模式来说,我们可以认为亮度在当前帧与参考帧是线性变化的,既有如下关系:

$LumaCur = \frac {weight \times LumaRef + offset} {2^5}$

其中权重(weight)会被归一化为32(2^5),因此我们就可以用weight与offset来表示两帧亮度的变化:

$weight = 2^5 \cdot \frac {\sum {LumaCur_i}_j} {\sum {LumaRef_i}_j}    $

$\left\{\begin{matrix}
0 \leq i < imgWidth\\
0 \leq j < imgHeight
\end{matrix}\right.$

尽管这种用整个帧的亮度做比较会忽视图像的局部变化,但是由于其简单的计算方式,目前JM还是用的这种方法来得到权重。当然,在得到权重之后我们需要判断该权重是否超出既定的阈值,如果超出阈值则表示亮度没有发生变化,采用默认的加权预测(即不预测)。

$offset = 0$    在JM中$offset$默认为0

隐式模式

隐式模式也同样是基于亮度线性变化的假设。B帧与其两个参考帧:RefFront与RefBack在POC位置上保持着线性的关系

$\begin{align*}
weightBack &= 2^6 \cdot \frac {LengthFront} {LengthFront + LengthBack} \\
weightFront &= 2^6 - weightBack
\end{align*}$

无论前向参考帧与后向参考帧距离有多长,最终都会归一化为64,然后求出两个参考帧的权重

最后的亮度补偿只是把参考帧用weight与offset进行线性处理而已

${{Luma_i}_j}' = \frac{weight \times {LumaRef_i}_j + offset} {2^n}$

最最后需要补充一句的是,因为当前还没确定应该用参考帧列表中的哪一帧作为当前帧的参考帧,所以加权预测必须对当前参考帧列表中的所有帧求出$weight$与$offset$,而隐式模式,更是需要对$listX[0]$与$listX[1]$两个参考帧列表中所有的帧进行$listXSize[0] \times listXSize[1]$次配对后,再分别求出每对参考帧的两个$weight$与$offset$

h.264加权预测的更多相关文章

  1. h.264直接预测

    直接预测是B帧上一种独有的预测方式,其中直接预测又分为两种模式: 时域直接模式(temporal direct).空域直接模式(spatial direct). 在分析这两种模式之前,有一个前提概念需 ...

  2. h.264语法结构分析

    NAL Unit Stream Network Abstraction Layer,简称NAL. h.264把原始的yuv文件编码成码流文件,生成的码流文件就是NAL单元流(NAL unit Stre ...

  3. h.264宏块与子宏块类型

    宏块类型mb_type 宏块类型表示的是宏块不同的分割和编码方式,在h.264的语法结构中,宏块类型在宏块层(macroblock_layer)中用mb_type表示(请参考h.264语法结构分析中的 ...

  4. H.264 White Paper学习笔记(二)帧内预测

    为什么要有帧内预测?因为一般来说,对于一幅图像,相邻的两个像素的亮度和色度值之间经常是比较接近的,也就是颜色是逐渐变化的,不会一下子突变成完全不一样的颜色.而进行视频编码,目的就是利用这个相关性,来进 ...

  5. H.264学习笔记3——帧间预测

    帧间预测主要包括运动估计(运动搜索方法.运动估计准则.亚像素插值和运动矢量估计)和运动补偿. 对于H.264,是对16x16的亮度块和8x8的色度块进行帧间预测编码. A.树状结构分块 H.264的宏 ...

  6. 【HEVC帧间预测论文】P1.2 An Efficient Inter Mode Decision Approach for H.264 Video Codin

    参考:An Efficient Inter Mode Decision Approach for H.264 Video Coding <HEVC标准介绍.HEVC帧间预测论文笔记>系列博 ...

  7. x264 - 高品质 H.264 编码器

    转自:http://www.5i01.cn/topicdetail.php?f=510&t=3735840&r=18&last=48592660 H.264 / MPEG-4 ...

  8. 【转】实现RTP协议的H.264视频传输系统

    1.  引言       随着信息产业的发展,人们对信息资源的要求已经逐渐由文字和图片过渡到音频和视频,并越来越强调获取资源的实时性和互动性.但人们又面临着另外一种不可避免的尴尬,就是在网络上看到生动 ...

  9. FFmpeg的H.264解码器源代码简单分析:宏块解码(Decode)部分-帧间宏块(Inter)

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

随机推荐

  1. DateTime日期格式获取 分类: C# 2014-04-15 10:36 233人阅读 评论(0) 收藏

    c#.net 获取时间年月日时分秒格式 //获取日期+时间 DateTime.Now.ToString();            // 2008-9-4 20:02:10 DateTime.Now. ...

  2. 输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)

    群里看到这道题,用python做了做, def find(array): v_sum = greatest = 0 for a in array: v_sum += a v_sum = 0 if v_ ...

  3. WebChat 清爽来袭 -- JavaChat系统Ⅳ

    题记:          WebChat 依然搭配的是 JavaChat 服务器,在不修改原来服务器代码的情况下进行使用终端的扩展.         此次项目的难点在于,Action/Servlet ...

  4. HeadFirst设计模式笔记:(六)命令模式 —— 封装调用

    1.概念 将来自客户端的请求传入一个对象,从而使你可用不同的请求对客户进行参数化.用于“行为请求者”与“行为实现者”解耦,可实现二者之间的松耦合,以便适应变化.分离变化与不变的因素. 在面向对象的程序 ...

  5. inux 安装中文支持包及中文字符集配置 +i18n

    由于某些原因系统安装时未安装中文支持,导致后续应用出现中文方块乱码现象, 解决方法很简单,当然不是重装,只需以下三步即可搞定. .安装中文包: yum -y groupinstall chinese- ...

  6. Gson解析json数据(转)

    一. www.json.org这是JSON的官方网站. 首先,我,我们需要在code.google.com/p/google-gson/downloads/list下载JSON的jar包,解析后把gs ...

  7. linux(centos)上配置nginx、mysql、php-fpm、redis开机启动<转>

    原文 http://levi.cg.am/archives/2925 I.nginx开机启动 在/etc/init.d/目录下创建脚本 1 vi  /etc/init.d/nginx 更改脚本权限 1 ...

  8. Ouath协议

    OAuth是一个开放协议,允许用户让第三方应用以安全且标准的方式获取该用户在某一网站.移动或桌面应用上存储的私密的资源(如用户个人信息.照片.视频.联系人列表),而无需将用户名和密码提供给第三方应用. ...

  9. 一段jquery代码,保存

    @CHARSET "UTF-8"; #table_id tbody tr.odd td:hover{ background-color:#93CFE5; } #table_id t ...

  10. ViewHolder的作用和用法

    一直都看别人用ViewHolder,自己也用过,却不知道它的作用是什么?但知道肯定很有用,而且现在android studio应该有直接生产Viewholder的插件, 不过博主我是个新手,就没尝试去 ...