HEVC帧内预测学习(二) 35种预测模式的计算

声明:转载请注明出处
先把参考像素的位置列出来。在这里插入图片描述在预测时,我们需要划分到一个预测单元中,也就是PU单元(大小为4x4到64x64),上图中p(0,0)-p(N,N)部分也就是白色的像素,就是一个预测单元;而对PU中的像素进行预测时,我们也需要得到这个PU单元的上方一行参考像素(也就是上图中的R(0,0)-R(2N,0))以及左侧一列参考像素(也就是上图中的R(0,0)~R(0,2n)),
注意:上图的(x,y)位置的确定是以坐标x轴y轴进行确定的(也就是表示第y行第x列)。而在MATLAB代码中,(x,y)分别表示第x行,第y列。以下公式对应上图坐标进行解释。

1.planar模式

该模式可分为水平与垂直预测,然后将其水平与垂直预测值求平均。适用于像素值变化缓慢的情况。
在这里插入图片描述
即预测该位置的像素时,需要知道PU单元的左下角第一个参考像素即R(0,N+1)和右上角第一个参考像素即R(N+1,0),以及该像素对应左侧和上方的参考像素R(0,y),R(x,0)。
在这里插入图片描述

2.DC模式

该模式适用于大面积平坦区域,
第一步就是求出该预测单元左侧及上方的像素的平均值
在这里插入图片描述

对于每个坐标的参考像素的确定需要分情况:
疑问:色度与亮度在一帧图像中的变化规律有什么区别吗
1.对于色度分量和大于16x16的亮度分量,则其预测像素值便是dcValue。
2.对于pu小于16x16的亮度分量
疑问:为什么每次都要保持有四个参考像素?能不能有八个?
① 左上角位置
在这里插入图片描述

将该位置上方与左侧参考像素与dcValue求平均
② 第一行位置
在这里插入图片描述

用该位置上方参考像素与dcValue求平均
③ 第一列位置
在这里插入图片描述

与第一行类似
④ 其他位置
在这里插入图片描述

3.角度预测模式

3.1书本讲解

在这里插入图片描述
上图中分析的模式23的θ角就是下图所示。在这里插入图片描述
而2~34号预测模式的偏移值分别为,刚好对应上图的坐标在这里插入图片描述
(29号模式偏移值为9,不是7,这里修改一下)
角度预测模式是按照先判断是否投影,然后再预测的方式进行的。
其中2-17号为水平类模式,10号为水平模式,18~34为垂直类模式,26号为垂直模式。

3.2预测方法

3.2.1投影(对参考像素二次整理)

2~10号
在这段预测模式中,属于水平类模式,其偏移值是大于零的,因此不需要进行投影,参考像素便是块左侧的2n+1个参考像素,计算公式如下图:在这里插入图片描述
11~17号
在这段预测模式中,同样属于水平类模式,但其偏移值是小于0的,因此需要进行投影,方法为:
在左上角参考像素上方位置处向上延伸,延伸出的参考像素为上方参考像素按照模式角度方向的投影,具体方法例程参考18~26号预测模式。
18~26号
这段预测模式中,属于垂直类模式,其偏移值小于0,因此需要投影,将左侧参考像素按照模式规定的角度方向进行投影,如下图方法。在这里插入图片描述
其中参考像素的计算公式如下图。Round为四舍五入。在这里插入图片描述

具体计算例子:在这里插入图片描述
比如20号预测模式,其参考像素上方与左上方不变,其参考像素
Ref[-1]=R(0,y(-1))
而y(-1)=32*(-1)/(-21)=2
所以Ref[-1] = R(0,2)
(为什么上述例子只计算到第8行,也就是投影只需要左侧8个参考像素,而不是所有16个:
根据上面式子,对比下面预测部分计算参考像素位置的公式,投影所需要的的左侧参考像素数刚好是N个,而不是所有左侧参考像素2N个,因为我们只需要预测到第N行的所有像素,而预测第N行的第一个像素所需要的参考像素就是其正对着的左侧参考像素投影过去的,其左下方参考像素的投影根本用不到。所以在实际设计中,我们只提取出左侧N+1个参考像素即可完成投影的任务,进而实现预测像素值。)
而即使偏移值小于0,也有可能因为偏移角太小而无法进行投影,书中的判断方法如下图。在这里插入图片描述
invAngle参数如下。应该是根据上面公式倒推过来的在这里插入图片描述
27~34号
在这段预测模式中,属于垂直类模式,其偏移值是大于零的,因此不需要进行投影,参考像素便是块左侧的2n+1个参考像素,计算公式如下图:在这里插入图片描述

3.2.2 预测

通过之前的投影,我们已经得到参考像素Ref[x]了,其中x的范围看是否投影,如果是模式2-10和26-34,其偏移值大于零,则不投影,那么x范围为(0,2N);而其余模式的偏移值是小于0的,则应当进行投影,那么其x的范围可能就会根据不同的角度模式范围会包括小于0的部分也就是(-a,2N)的范围,其中a是个动态的,与模式号有关。

  • 首先,预测一个像素,要找到我们需要参考的像素才行,而通过模式对应的角度则可以计算出对应的参考像素。标准有这样的公式可以用来计算。
    在这里插入图片描述
    解释: 这个pos,指的是预测第y行对应的左侧参考像素位置时所需要的参考像素的坐标
    y是当前像素的行,offset[M]是该模式的偏移值。其代表的物理意义就是根据行的位置,按照模式规定的角度方向指向上方参考像素位置。
    从这个公式对比在这里插入图片描述
    可以看出,如果只看数学表达式的话,预测当前行左侧参考像素时,所需要的参考像素刚好是该行正左侧参考像素的投影。
  • 计算对应参考像素的加权因子w,标准是这样定义的。在这里插入图片描述
    &是按位与。取低五位。(意义参考下面加黑字体分析)。
    我的理解: 当偏移值offset[M]是正的,就是按照公式计算,当是负的时,可以先计算y*offset[M]的绝对值,然后取低五位,假设为a,w=32-a,就得出了结果。至于负数的时候为什么这样算,看下面黑体字可以理解。
    当模式2、10、18、26、34时,w=0。则根据下面预测公式,只需要保留n个参考像素即可,而其他模式需要保留n+1个参考像素。
    3.计算当前像素预测值
    在这里插入图片描述
    y表示行,x表示列。
    所以第y行第1个预测像素为:
    在这里插入图片描述
    同理第2个预测像素为:
    在这里插入图片描述
    注:在MATLAB代码中,除了10、26以外所有像素预测都是用这个方式进行
    (计算公式的意义:可以将w与pos联合进行理解,pos作为高位,w作为低位。实际上pos是取yoffset[M]除以32的整数部分,而其实际的投影位置一般是处于pos与pos+1的地方,当小数部分越小,对应的参考像素就越接近pos对应的位置,反之就越接近pos+1的位置的参考像素,而将w除以32的话就相当于yoffset[M]除以32的小数部分,因此将w作为权值。现在参考下面预测计算公式,这就相当于pos位置的参考像素占了(32-w)/32,而pos+1位置的参考像素占了w/32,而这只是针对偏移值大于零的部分是这样考虑的,而当偏移值小于零时,这个w就应当反了过来,因为其占比是反过来的,所以对于上面计算w的时候,会有32-a这样的理解。)
    这样来理解的话,上面的公式只适用于偏移值大于零的模式,对于偏移值小于零的时候就有点矛盾了。
    当偏移值小于零的时候,预测值就应当这样计算。
    在这里插入图片描述

对于26垂直模式,以及10水平模式,我们需要根据不同CU尺寸对边界像素进行滤波计算得到预测值。
当大于16x16时,不进行边界滤波,否则对26和10号模式进行边界滤波。
1.26模式时,只对每个预测块的第一列像素用滤波公式计算,剩余的像素使用上面公式计算。
在这里插入图片描述
右边括号部分是为了预测垂直方向像素变化规律。
2.模式10时,只对每个预测块的第一行的像素使用滤波公式进行滤波,剩余的像素使用上面公式计算。
在这里插入图片描述
右边括号部分是为了预测水平向像素变化规律。

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。
以下是一个简单的MATLAB代码示例,用于实现HEVC预测: ```matlab function [predBlock] = intra_predict(image, blockSize, row, col, mode) % image: 输入图像 % blockSize: 块大小 % row, col: 当前块的起始行和列 % mode: 预测模式 % 获取参考像素 switch(mode) case 0 % 模式0:DC预测 refBlock = image(row:blockSize + row - 1, col:blockSize + col - 1); p = mean2(refBlock); predBlock = ones(blockSize, blockSize) * p; case 1 % 模式1:水平预测 refBlock = image(row:blockSize + row - 1, col - 1); predBlock = repmat(refBlock, [1, blockSize]); case 2 % 模式2:垂直预测 refBlock = image(row - 1, col:blockSize + col - 1); predBlock = repmat(refBlock, [blockSize, 1]); case 3 % 模式3:左上角预测 refBlock = image(row - 1, col - 1); predBlock = ones(blockSize, blockSize) * refBlock; case 4 % 模式4:右上角预测 refBlock = image(row - 1, col + blockSize); predBlock = ones(blockSize, blockSize) * refBlock; case 5 % 模式5:左下角预测 refBlock = image(row + blockSize, col - 1); predBlock = ones(blockSize, blockSize) * refBlock; case 6 % 模式6:垂直右下预测 refBlock1 = image(row - 1, col + blockSize); refBlock2 = image(row - 2, col + blockSize); refBlock3 = image(row - 3, col + blockSize); refBlock4 = image(row - 4, col + blockSize); refBlock5 = image(row - 5, col + blockSize); refBlock6 = image(row - 6, col + blockSize); refBlock7 = image(row - 7, col + blockSize); refBlock = (refBlock1 + 2 * refBlock2 + 3 * refBlock3 + 4 * refBlock4 + 5 * refBlock5 + 6 * refBlock6 + 7 * refBlock7 + 8) / 16; predBlock = ones(blockSize, blockSize) * refBlock; case 7 % 模式7:水平右下预测 refBlock1 = image(row + blockSize, col - 1); refBlock2 = image(row + blockSize, col - 2); refBlock3 = image(row + blockSize, col - 3); refBlock4 = image(row + blockSize, col - 4); refBlock5 = image(row + blockSize, col - 5); refBlock6 = image(row + blockSize, col - 6); refBlock7 = image(row + blockSize, col - 7); refBlock = (refBlock1 + 2 * refBlock2 + 3 * refBlock3 + 4 * refBlock4 + 5 * refBlock5 + 6 * refBlock6 + 7 * refBlock7 + 8) / 16; predBlock = ones(blockSize, blockSize) * refBlock; end end ``` 请注意,此代码仅实现了HEVC预测的一些基本模式,可能需要根据您的特定需求进行更改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值