H264/AVC-帧内预测相邻像素推导过程

news/2024/10/8 2:23:58

帧内预测过程会以相邻块的像素值做参考,来预测当前块的像素值。以Intra_4x4为例,如下图所示,需要用到的13个相邻像素值,那么如何获取这13个像素值?

本文要主要说明如何获取帧内预测所用到的相邻像素。

获取相邻像素的流程如下:

  1. 找到当前块(可以为4x4、8x8、16x16大小)的左、上、右上、左上相邻块
  2. 找到左、上、右上、左上相邻块所在宏块
  3. 根据当前宏块以及相邻块所在宏块确定相邻像素

在此之前需要先知道宏块地址是否可用,如果宏块地址不可用,则在该宏块的相邻像素也都不可用。

1.宏块地址可用性推导

宏块不可用主要有以下三种情况:

  1. mbAddr<0,此时该宏块不存在
  2. mbAddr>CurrMbAddr,也就是在当前解码宏块之后的宏块,显然后面的宏块还为解码,不可用做预测
  3. mbAddr和CurrMbAddr属于不同slice

2.相邻宏块地址及其可用性的推导

分为两种情况:

  1. MbaffFlag=0
  2. MBaffFlag=1

2.1 非MBAFF宏块(帧宏块或场宏块)

mbAddrA:表示当前宏块左侧宏块的地址和可用性状态。
mbAddrB:表示当前宏块上侧宏块的地址和可用性状态。
mbAddrC:表示当前宏块右上侧宏块的地址和可用性状态。
mbAddrD:表示当前宏块左上侧宏块的地址和可用性状态。
下图表示当前宏块和四个相邻宏块的空间位置

 

2.2 MBAFF宏块

对于MBAFF格式,是以宏块对方式成对出现,一个宏块对包含顶宏块和底宏块。
帧宏块对和场宏块对数据存放方式也有差异。
一个宏块对亮度分量有32行数据,如果当前宏块对为帧宏块,则顶帧宏块由1-16行数据组成,底帧宏块由17-32行数据组成;
如果当前宏块对为场宏块,则顶场宏块为奇数行数据组成,底场宏块为偶数行数据组成。

mbAddrA:表示当前宏块左侧宏块对中顶宏块的地址和可用性状态。
mbAddrB:表示当前宏块上侧宏块对中顶宏块的地址和可用性状态。
mbAddrC:表示当前宏块右上侧宏块对中顶宏块的地址和可用性状态。
mbAddrD:表示当前宏块左上侧宏块对中顶宏块的地址和可用性状态。
下图表示当前宏块和四个相邻宏块的空间位置,不管当前宏块是顶宏块还是底宏块,四个相邻宏块都是相同的。

3.相邻宏块、块的推导过程

帧内预测所用的块大小有三种情况(16x16、8x8、4x4)。
以8x8块为例,如下图所示,当前宏块分为4个8x8块。

idx=0的8x8块,左相邻块为mbAddrA中idx为1的8x8块,如果mbAddrA不可用,则左相邻块也不可用,
上相邻块为mbAddrB中idx为2的8x8块,
左上相邻块为mbAddrD中idx为3的8x8块。

idx=3的8x8块,左相邻块为当前宏块中idx为2的8x8块,
上相邻块为当前宏块中idx为1的8x8块,
左上相邻块为当前宏块中idx为0的8x8块。

 


因此,相邻块的推导过程,需要先找到相邻块所在宏块,确定宏块是否可用。

4.相邻像素推导过程

本过程的输入为相对于当前宏块左上角样点位置的亮度或色度位置(xN,yN)。
本过程的输出为:
mbAddrN:等于CurrMbAddr或等于包含(xN,yN)的相邻宏块的地址,及其可用性,
( xW, yW ):表示与宏块mbAddrN左上角的相对(不是相对于当前宏块左上角)位置(xN,yN)。

比如xN=-1,yN=-1,表示获取当前宏块左上角相邻像素,显然(xN,yN)像素所在宏块为左上角宏块mbAddrD,( xW, yW )=(15, 15).

相邻像素推导根据当前宏块是否为MBAFF分为两种情况。

4.1场和非MBAFF帧中相邻像素

MbaffFlag=0时,相对简单相邻像素的推导如下表所示。

4.2 MBAFF帧中相邻像素

MbaffFlag=1时,要根据当前宏块帧/场属性、顶/底场属性以及相邻块帧/场属性、顶/底场属性做不同的处理,相对复杂。
以xN=-1,yN=-1为例,也就是得到左上相邻像素。
其相邻像素可以由下表获得:


currMbFrameFlag,表示当前宏块是否为帧宏块
mbIsTopMbFlag,表示当前宏块为顶宏块还是底宏块
mbAddrX,表示相邻宏块对,还不能确定最终相邻宏块是使用顶宏块还是底宏块
mbAddrXFrameFlag,表示相邻宏块是否为帧宏块
mbAddrN,表示最终的相邻宏块

相邻像素推导可分为四个步骤:

  1. 根据currMbFrameFlag和mbIsTopMbFlag确定当前宏块左上角像素在帧图像中对应的像素点;
  2. 根据当前宏块的属性来确定相邻像素点;
  3. 确定相邻像素点所属宏块对mbAddrX;
  4. 根据相邻宏块对的属性mbAddrXFrameFlag来确定相邻像素点所属宏块mbAddrN;

根据当前宏块帧、场格式以及顶、底属性分四种情况分析
1.当 currMbFrameFlag = 1,mbIsTopMbFlag = 1,也就是当前宏块为帧宏块,并且为顶宏块

  1. 确定当前宏块左上角像素在帧图像中对应的像素点:
    currMbFrameFlag = 1,mbIsTopMbFlag = 1:当前宏块为顶帧宏块,其左上角像素的对应像素点为 c
  2. 根据当前宏块的属性来确定相邻像素点:
    因为当前宏块为顶帧宏块,所以 c 的左上角相邻像素点为 a
  3. 确定相邻像素点所属宏块对:
    因为宏块对是用顶宏块的地址表示,所以像素点 a 所属宏块对为 mbAddrD,因此 mbAddrX = mbAddrD
  4. 根据相邻宏块对的属性来确定相邻像素点所属宏块:
    (1)、如果 mbAddrX 是帧宏块对(即mbAddrXFrameFlag = 1),像素点 a 属于宏块 mbAddrD+1,所以mbAddrN = mbAddrD+1
    (2)、如果 mbAddrX 是场宏块对(即mbAddrXFrameFlag = 0),像素点 a 在场图像时(即进行隔行抽取后)属于宏块mbAddrD+1
    ,因此mbAddrN = mbAddrD+1

2. 当 currMbFrameFlag = 1,mbIsTopMbFlag = 0,也就是当前宏块为帧宏块,并且为底宏块

  1. 确定当前宏块左上角像素在帧图像中对应的像素点:
    currMbFrameFlag = 1,mbIsTopMbFlag = 0:当前宏块为低帧宏块,其左上角像素的对应像素点为 f
  2. 根据当前宏块的属性来确定相邻像素点:
    因为当前宏块为底帧宏块,所以 f 的左上角相邻像素点为 e
  3. 确定相邻像素点所属宏块对:
    因为宏块对是用顶宏块的地址表示,所以像素点 e 所属宏块对为 mbAddrA,因此表 6-4 中 mbAddrX = mbAddrA
  4. 根据相邻宏块对的属性来确定相邻像素点所属宏块:
    (1)、如果 mbAddrX 是帧宏块对(即mbAddrXFrameFlag = 1),像素点 e 属于宏块 mbAddrA,因此mbAddrN = mbAddrA
    (2)、如果 mbAddrX 是场宏块对(即mbAddrXFrameFlag = 0),像素点 e 在图像的偶数行,属于底场宏块 mbAddrA+1,因此mbAddrN = mbAddrA+1

3.当 currMbFrameFlag = 0,mbIsTopMbFlag = 1,当前宏块为顶场宏块

1、确定当前宏块左上角像素在帧图像中对应的像素点:
currMbFrameFlag = 0,mbIsTopMbFlag = 1:当前宏块为顶场宏块,其左上角像素的对应像素点为 c
2、根据当前宏块对的属性来确定相邻像素点:
因为当前宏块为顶场宏块,所以 c 的左上角相邻像素点为 b
3、确定相邻像素点所属宏块对:
因为宏块对是用顶宏块的地址表示,所以像素点 b 所属宏块对为 mbAddrD,因此 mbAddrX = mbAddrD
4、根据相邻宏块对的属性来确定相邻像素点所属宏块:
(1)、如果 mbAddrX 是帧宏块对(即mbAddrXFrameFlag = 1),像素点 b 属于宏块 mbAddrD+1,因此mbAddrN = mbAddrD+1
(2)、如果 mbAddrX 是场宏块对(即mbAddrXFrameFlag = 0),像素点 b 在场图像奇数行,属于顶场宏块 mbAddrD,因此mbAddrN = mbAddrD

4.当 currMbFrameFlag = 0,mbIsTopMbFlag = 0,当前宏块为底场宏块

1、确定当前宏块左上角像素在帧图像中对应的像素点:
currMbFrameFlag = 0,mbIsTopMbFlag = 0:当前宏块为低场宏块,其左上角像素的对应像素点为 d
2、根据当前宏块对的属性来确定相邻像素点:
因为当前宏块为低场宏块,所以 d 的左上角相邻像素点为 a
3、确定相邻像素点所属宏块对:
因为宏块对是用顶宏块的地址表示,所以像素点 a 所属宏块对为 mbAddrD,因此表 6-4 中 mbAddrX = mbAddrD
4、根据相邻宏块对的属性来确定相邻像素点所属宏块:
无论 mbAddrX 是帧宏块对还是场宏块对(即无论mbAddrXFrameFlag 值为多少),像素点 a 都属于宏块 mbAddrD+1
(1)、如果 mbAddrX 是帧宏块对(即mbAddrXFrameFlag = 1),像素点 a 属于宏块 mbAddrD+1,因此mbAddrN = mbAddrD+1
(2)、如果 mbAddrX 是场宏块对(即mbAddrXFrameFlag = 0),像素点 a 在场图像偶数行,属于底场宏块 mbAddrD+1,因此mbAddrN = mbAddrD+1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/28161.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

R:OTU根据分类级别拆分

输入文件输出文件 rm(list = ls()) setwd("C:\\Users\\Administrator\\Desktop\\microtable") #设置工作目录 library(dplyr) library(tidyr) library(readr)# 读取文件 data <- readLines(1.txt)# 定义分类等级的前缀和列名 prefixes <- c("k__", &…

MySQL排序时, ORDER BY将空值NULL放在最后

我们在日常工作当中;往往业务会提到一些莫名其妙的排序等规则;例如:按照某个字段升序排列,同时空值放在后面;但mysql默认升序排列时空值是在最前面;有下面几个方法: 方法一:ORDER BY 字段 IS NULL ,字段 ;方法二:SELECT * FROM test ORDER BY IF(ISNULL(字段),1,0),字…

《深度学习原理与Pytorch实战》(第二版)(三)11-15章

第11章 神经机器翻译器——端到端机器翻译神经机器翻译,google旗下的NMT 编码-解码模型:用编码器和解码器组成一个翻译机,先用编码器将源信息编码为内部状态,再通过解码器将内部状态解码为目标语言。编码过程对应了阅读源语言句子的过程,解码过程对应了将其重组为目标语言…

STM32F1和STM32F4系列DMA的不同之处——对STM32的DMA的工作机制的一些理解

比较STM32F4和STM32F1系列的DMA控制器,区别主要有三:1)增加了DMA流(Stream)的概念;2)限制了两个DMA控制器的数据流向;3)为每个数据流添加了可配置的FIFO缓冲区。 本文逐一比较了以上三种硬件上的改变带来的功能方面的升级和不同。另外,还大胆猜测了STM32的芯片设计者…

Apache Log4j2远程命令执行漏洞

Log4j2框架下的Lookup查询服务提供了{}字段解析功能,传进去的值会被直接解析。在lookup的{}里面构造Payload,调用JNDI服务获取恶意的class对象,造成了远程代码执行。目录漏洞原理复现反弹shell漏洞修复 AApache Log4j2 是一个基于Java的日志记录工具,被广泛应用于业务系统开…

使用collections中的namedtuple来处理数据

前言 tuple在python中是一种不可变的数据结构,和list这种可变的数据结构比较,两者都可以使用索引来读取数值,但是tuple不可变动,因此其不能修改其中的值。 示例:tuple适合存储不需要频繁变动的数据,但是在使用index来读取tuple中的item值时,就会存在问题,问题在于如果i…

JavaGUI - [04] BoxLayout

Swing编程题记部分 一、简介为了简化开发,Swing引入了一个新的布局管理器:BoxLayout。BoxLayout可以在垂直和水平两个方向上摆放GUI组件,BoxLayout提供了如下一个简单的构造器: BoxLayout(Container target,int axis)指定创建基于target容器的BoxLayout布局管理器,该布局管…

交换机基础及stp

一、交换机基础 交换机工作在数据链路层,转发数据帧,隔绝了以太网层的冲突域 1、泛洪未知单播泛洪 广播数据2、转发根据mac地址表进行转发 3、丢弃收到的arp请求中的目的mac地址是发起的接口,则会丢弃 二、stp(生成树协议) 环路引起广播风暴,网络中的主机会受到重复数据帧…