首页 > 其他分享 >H.264 入门篇 - 14 (去块滤波)

H.264 入门篇 - 14 (去块滤波)

时间:2023-04-10 20:24:44浏览次数:57  
标签:q0 p0 H.264 14 滤波 入门篇 差值 宏块 边界

目录

1、产生的原因

2、去块滤波的作用

3、去块滤波的执行过程

3.1、概念

3.2、宏块去块滤波的过程

3.2.1、计算边界强度

3.2.2、区分真假边界

4、滤波运算

4.1、BS < 4

4.2、BS = 4


 

H264视频编码标准中,在解码器反变换量化后会出现块效应。

1、产生的原因

  1. 量化过程是有损的,会引入误差。变换系数的量化过程相对粗糙,因而反量化过程恢复的变换系数带有误差,会造成图像块边界上视觉不连续;
  2. 运动补偿预测。运动补偿是从不同帧的不同位置上内插采样点数据复制而来。因为运动补偿块的匹配不可能绝对准确,所以会在边界上产生数据不连续。

因此,需要一个去块滤波器改善画面质量。

2、去块滤波的作用

核心作用在于消除编码过程中产生的图像块效应;

3、去块滤波的执行过程

3.1、概念

去块滤波对于每一个宏块的亮度和色度分量分别进行

对于宏块的每一个分量的滤波过程分为两个方向:(先是垂直方向再是水平方向)

垂直方向:垂直方向的滤波从左向右进行

水平方向:水平方向的滤波从上向下进行

 

 


上图整体表示一个16x16的宏块,每个小框表示的是子块,左边表示垂直方向的边沿,右边表示水平方向的边沿,实线表示半宏块的边沿,虚线表示1/4宏块的边沿。

对于亮度/色度以及不同的参数设置,去块滤波操作的边沿不同。

对于亮度分量,根据 transform_size_8x8_flag(宏块信息中)的值判断:

  • 如果transform_size_8x8_flag为0,即采用4×4尺寸变换,对实线和虚线的边沿进行滤波;
  • 如果transform_size_8x8_flag为1,即采用8×8尺寸变换,只对实线的块边沿进行滤波;

对于色度分量,只考虑4:2:0格式,只对半宏块边沿即实线部分进行滤波。

3.2、宏块去块滤波的过程

去块滤波以16x16宏块为单位,对每个4x4块或8x8块边界进行滤波。滤波过程包括边界分析和滤波运算两部分。边界分析主要解决两个问题:

  • 计算边界强度,对不同强度边界采用不同强度的滤波,如果强度不够则滤波效果不好,块效应依然明显,强度太大则图像细节损失太多,影响视频主管效果;
  • 解决真假边界问题,视频图像中有可能物体的边界刚好在两块的边界上,在做去块效应滤波时当然不希望把物体的边界轮廓弄得模糊,因此需要判断真假边界

3.2.1、计算边界强度

对4x4块定义边界强度,设P块和Q块为两相邻块,按下表决定边缘强度

判断条件

边界强度 (BS)

P 块或 Q 块为帧内编码模式,且块边缘为宏块边缘

4

P 块或 Q 块为帧内编码模式

3

P 块或 Q 块的残差变换系数不都为 0

2

P 块或 Q 块的残差变换系数都为 0,但 P 块和 Q 块参考帧或运动项目不同

1

P 块或 Q 块的残差变换系数都为 0,但 P 块和 Q 块参考帧或运动项目相同

0

色度块的边界不需要单独计算,直接等于对应亮度块的边界强度。

3.2.2、区分真假边界

去块滤波最核心部分就是区分真假边界,关于真假边界区分是基于两个假设:

  • 真实边界两边像素点的差值通常比虚假边界两边像素差值要大;
  • 对于两边像素差值小的真实边界,即使使用平滑滤波,其主观效果也不会有太大的影响。

因此,去块滤波应该遵循以下原则:

  • 在平坦区域,即使很小的像素不连续也很容易被人察觉,所以要使用比较强的去块滤波,可以改变较多的像素点
  • 对于复杂的区域,为了保持图像细节,要使用较弱的去块滤波,改变较少的像素点

为区分真假边界,需要对被滤波边界两边的像素值进行分析。定义两个相邻4x4块中一条直线上的采样点为p3、p2、p1、p0、q0、q1、q2、q3,如下图所示。

 

 

H264标准中设定了两个阈值 α(alpha) 和 β(beta) 来判断虚假边界

α(alpha) 表示块与块之间的边界阈值;

β(beta) 表示块内边界的阈值。

对于边界两边像素点的差值,满足下面三个条件就判定为需要滤波的虚假边界。

| p0-q0 | < α

| p1-p0 | < β

| q1-q0 | < β

4、滤波运算

当边界强度BS不为0时,就需要进行滤波。H.264 的边缘滤波有两种滤波器:

4.1、BS < 4

BS < 4 时采用强度较弱的滤波器,首先改变p0、q0两个像素点,接着用阈值 β(beta) 判断是否需要调整p1、q1的值;过程如下

首先对边界上的两个像素点p0与q0进行滤波,它需要输入p1、p0、q0、q1,滤波过程如下:

 

 

  1. 先要得到差值Δ,差值的计算方式:Δ = ( (q0-p0)> 3
  2. 然后需要对差值Δ进行限幅,保证这个差值在一定的范围内,这个范围主要通过查表得到,详情请查看标准8.7.2.3
  3. 用差值Δ来计算新的p0、q0,也就是滤波后的值

接下来对块内的像素点p1与q1分别进行滤波。4:2:0以及4:2:2色度宏块边界的话是不需要执行这部分的滤波的。如果是要计算p1,则需要输入p2、p1、p0、q0;如果是q1,则需要输入p0、q0、q1、q2。

另外,只有满足|p2-p0|

 

 

  1. 先要得到差值Δ,差值的计算方式为:Δ = ( p2 + ((p0+q0+1)>>1) − (p1> 1
  2. 然后需要对差值Δ进行限幅,保证这个差值在一定范围内,这个范围主要通过查表得到,详情请查看标准8.7.2.3
  3. 用差值来计算新的p1

 

q1的滤波过程也是类似的步骤。

4.2、BS = 4

BS = 4 时有两种强度的滤波,强滤波可以改变6个像素点(p0、p1、p2、q0、q1、q2),弱滤波只改变边界上的两个点(p0、q0)

在h.264的帧内预测编码中,倾向于对纹理简单的区域用16x16亮度预测模式编码(如蓝天、白色墙面等),以达到快速编码的目的。虽然这种方法只会在宏块边界引起轻微的块效应,但是在这种情况下,即使很小的强度值查表也会在视觉上产生陡峭的阶梯状的感觉(色块分层),因而对于这种内容平滑的宏块边界就需要采用较强的滤波器;如果此时宏块边界有大量的细节存在,反而不应做强滤波。对此h.264仍采用阈值法来判断是否存在真实边界,如果不存在大量细节信息,可以做强滤波,反之做弱滤波。

这里的滤波是比较好理解的抽头滤波器,P、Q块上的滤波过程差不多,这里以P块为例。

对于P块的点,如果满足下式,则认为细节信息不多:

 

 

采用强滤波

 

 

否则采用弱滤波,只改变p0点

 

 

参考:h.264 去块滤波h.264 去块滤波 - TaigaComplex - 博客园h.264 去块滤波

转自:https://stephenzhou.blog.csdn.net/article/details/127344818

详细运算过程参考 H.264 的 8.7.2.3 和 8.7.2.4 节

标签:q0,p0,H.264,14,滤波,入门篇,差值,宏块,边界
From: https://www.cnblogs.com/wjune-0405/p/17304161.html

相关文章

  • 3500/32M 149986-02 产生的信息不产生实时数据
    3500/32M149986-02产生的信息不产生实时数据尽管墨西哥对公共交通服务的需求很高,但是公共交通的用户目前并不了解公共汽车上的座位情况,尽管大量用户全天都在使用该服务。为了给这个问题提供一个具体的解决方案,在这项工作中开发了一种电子设备来计算上/下车的人数。这种被称为“......
  • Lighting System Design uva11400
    设计一个照明系统,一共有n(n<=1000)种灯泡可供选择,不同种类的灯泡必须用不同的电源,同一种灯泡则可以用一个,输入为一个n,以下n行,每行四个数值,代表电压V,电源费用K,每个灯泡费用C,所需灯泡数量L。n=0为结束标志。为了省钱,你可以把一些灯泡换成电压更高的以节省电源的钱,但不能换成更低的,......
  • 2023第14届蓝桥杯C/C++A组参赛记录+部分题解
    比赛记录早上起得还算早,没吃早餐,我吃早餐会瞌睡,也会变蠢。在门口还没来得及和队里其他同学聊几句就进场了......键盘还是一样的难用,软件有codeblocks和dev,很舒服。今年来参加蓝桥杯的人好多啊......女生也好多。听说今年蓝桥杯有统一的正经培训,不过和我这个被踢出蓝桥杯群的......
  • c++Primer 14 重载运算符与类型转换
    除了重载的函数调用运算符operator()之外,其他重载运算符不能含有默认实参。      泛型算法中调用的几元谓词是看函数对象的调用运算符的参数个数。而不是构造函数的参数个数。    转换构造函数只能有一个参数,如果他有多个参数,就无法判断是将哪个参数转......
  • 【解题报告?】14 Understand Variants
    整个活。洛谷愚人节比赛2023的F题。这题一看就知道是WYXkk出的,高浓度解密元素(洛谷链接入口Understand和14MinesweeperVariants都看见过,但是都没自己玩过(可以先自己玩玩,挺好玩的(可以说是演绎法的练习?(Understand不贵,快买!(我还没买,会买的会买的)1.Tutorial教程。......
  • 14.7.2014年41题真题讲解
    function.h////Createdby93757on2023/3/21.//#ifndefINC_1_TREE_FUNCTION_H#defineINC_1_TREE_FUNCTION_H#include<stdio.h>#include<stdlib.h>typedefintBiElemType;typedefstructBiTNode{BiElemTypeweight;//c就是书籍上的data......
  • 14.6二叉树的层序遍历实战
    function.h////Createdby93757on2023/3/21.//#ifndefINC_1_TREE_FUNCTION_H#defineINC_1_TREE_FUNCTION_H#include<stdio.h>#include<stdlib.h>typedefcharBiElemType;typedefstructBiTNode{BiElemTypec;//c就是书籍上的datastru......
  • 14.4二叉树层次建树
    创建function函数////Createdby93757on2023/3/21.//#ifndefINC_1_TREE_FUNCTION_H#defineINC_1_TREE_FUNCTION_H#include<stdio.h>#include<stdlib.h>typedefcharBiElemType;typedefstructBiTNode{BiElemTypec;//c就是书籍上的datast......
  • 在Ubutu(14.10)的Eclipse启动Tomcat,以及部署问题
    启动Tomcat安装了阿土14.10(启动盘报gfxboot.c32:notaCOM32Rimage,网上查得输入live,果然可以,对此解决方式只能说),想装一个javaservlet的环境,下载了eclipse,通过apt-getinstall安装了tomcat和openjava。但是在运行时,RunOnServer中ServerName无法显示,导致无法运行。根据网上的指......
  • Pro Android学习笔记(二六):用户界面和控制(14):RelativeLayout
    相对布局:RelativeLayoutRelativeLayout也是非常常用的布局,能够精确对控件的位置进行网格对齐,可以设置在控件与其他控件的相对位置,以及控件在容器中的位置。缺省控件的位置为最上面还最左边。下面结合一个例子来进行解说。<?xmlversinotallow="1.0"encoding="utf-8"?><Relativ......