视频原理:预测/变换+量化处理/熵编码/环路过滤器【 矢量量化和标量量化(语音识别,图像压缩)等 】

视频编码:预测 -> 变换+量化处理 -> 熵编码 -> 环路过滤器;
视频解码:熵编码 -> 预测 -> 反量化处理+变幻 -> 环路过滤器;

-----------

--1. 视频预测
谷歌大脑提出基于流的视频预测模型,可产生高质量随机预测结果-https://www.jiqizhixin.com/articles/2019-03-09-2
基于深度学习的视频预测研究综述- https://blog.csdn.net/wcx1293296315/article/details/81286221

即时通讯音视频开发(四):视频编解码之预测技术介绍- http://yunxin.163.com/blog/zhuan-im3-4/
  预测技术的作用:目的是去除空间冗余和时间冗余。因为视频存在大量的空间冗余和时间冗余,包括空间冗余、时间冗余,预测后得到去除大部分空间或时间冗余的残差。
  实时音视频技术 = 音视频处理技术 + 网络传输技术 的横向技术应用集合体,而公共互联网不是为了实时通信设计的。图像空间相邻像素具有很强的相关性,帧内预测技术去除空间冗余。
  视频图像在时间上有较强的相关性,即存在时间冗余。去除时间冗余的编码技术有:运动估计(Motion Estimation,ME)、运动补偿(Motion Compensation,MC)。
  运动估计:目的是去除视频图像的时间冗余。运动估计在搜索范围内为当前块寻找匹配最好的预测块,全搜索方式的运动估计计算复杂度高。
  时域运动位置更可能在整象素之间,即分像素上。利用相邻的整象素可以估计出分象素的值:常用线性或双线性插值得到分象素的值。分象素运动估计有更高的预测精度,但复杂度也更高:1/2分象素运动估计,图像存储空间增加4倍,运动矢量需要放大2倍,1/4分象素运动估计,图像存储空间增加16倍,运动矢量需要放大4倍,计算复杂度也成倍增加。
  视频内容的运动非常复杂,图像分块编码可以更好的提高运动预测精度,提高压缩效率。要在编码块大小和附信息(MV,Mode)编码比特数之间权衡,小的编码块大小会有更好的预测但有更多的附信息比特数。
  B帧有更好的编码效率:新出现的对象参考将来的帧有更好的预测效果,前后两个预测的平均值可以减少预测方差。

视频压缩编码技术(H.264) 之帧内预测- https://cloud.tencent.com/developer/article/1351565
- 帧内预测 I帧
  帧内预测可以防止视频产生锯齿现象。
  在帧内预测模式中,预测块 P 是基于已编码重建块和当前块形成的。对亮度像素而言,P 块用于4×4 子块或者16×16 宏块的相关操作。4×4 亮度子块有9 种可选预测模式,独立预测每一个4×4亮度子块,适用于带有大量细节的图像编码;16×16 亮度块有4 种预测模式,预测整个16×16 亮度块,适用于平坦区域图像编码;色度块也有4 种预测模式,类似于16×16 亮度块预测模式。编码器通常选择使P 块和编码块之间差异最小的预测模式。
  此外,还有一种帧内编码模式称为I_PCM 编码模式。该模式下,编码器直接传输图像像素值,而不经过预测和变换。在一些特殊的情况下,特别是图像内容不规则或者量化参数非常低时该模式比起“常规操作”(帧内预测—变换—量化—熵编码)效率更高。

I帧,I_PCM 模式用于以下目的:
 1)允许编码器精确的表示像素值
 2)提供表示不规则图像内容的准确值,而不引起重大的数据量增加。
 3)严格限制宏块解码比特数,但不损害编码效率。
  在以往H.263+、MPEG-4 等视频压缩编码标准中,帧内编码被引入变换域。H.264 帧内编码则参考预测块左方或者上方的已编码块的邻近像素点,被引入空间域。但是,如果参考预测块是帧间编码宏块,该预测会因参考块的运动补偿引起误码扩散。所以,参考块通常选取帧内编码的邻近块。

 16×16 亮度预测模式:宏块的全部16×16 亮度成分可以整体预测,有4 种预测模式,帧内16×16 模式适用于图像平坦区域预测。
 8×8 色度块预测模式:每个帧内编码宏块的8×8色度成分由已编码左上方色度像素预测而得,两种色度成分常用同一种预测模式。4 种预测模式类似于帧内16×16 预测的4 种预测模式,只是模式编号不同。其中DC(模式0)、水平(模式1)、垂直(模式2)、平面(模式3)。每个帧内编码宏块的8×8色度成分由已编码左上方色度像素预测而得,两种色度成分常用同一种预测模式。4 种预测模式类似于帧内16×16 预测的4 种预测模式,只是模式编号不同。其中DC(模式0)、水平(模式1)、垂直(模式2)、平面(模式3)

视频压缩基础知识——预测编码- https://blog.csdn.net/w1378236582/article/details/84634338
H264视频压缩算法- https://blog.csdn.net/garrylea/article/details/78536775
H264视频压缩算法- https://www.cnblogs.com/pjl1119/p/9914861.html 
  H264压缩技术主要采用了以下几种方法对视频数据进行压缩。包括:
(1) 帧内预测压缩:解决的是空域数据冗余问题。
(2) 帧间预测压缩:(运动估计与补偿),解决的是时域数据冗余问题。
(3) 整数离散余弦变换(DCT):将空间上的相关性变为频域上无关的数据,然后进行量化。
(4) CABAC压缩。
  经过压缩后的帧分为:I帧,P帧和B帧:
I帧:关键帧,采用帧内压缩技术。
P帧:向前参考帧,在压缩时,只参考前面已经处理的帧。采用帧间压缩技术。
B帧:双向参考帧,在压缩时,它即参考前面的帧,又参考它后面的帧。采用帧间压缩技术。
  图像序列GOP:
GOP:两个I帧之间是一个图像序列;一个图像序列中只有一个I帧。

H264对比较平坦的图像使用 16X16 大小的宏块。但为了更高的压缩率,还可以在 16X16 的宏块上更划分出更小的子块。子块的大小可以是 8X16、 16X8、 8X8、 4X8、 8X4、 4X4,非常的灵活。

- 帧分组
  对于视频数据主要有两类数据冗余,一类是时间上的数据冗余,另一类是空间上的数据冗余。其中时间上的数据冗余是最大的。
  为什么说时间上的冗余是最大的呢?假设摄像头每秒抓取30帧,这30帧的数据大部分情况下都是相关联的。也有可能不止30帧的的数据,可能几十帧,上百帧的数据都是关联特别密切的。
  对于这些关联特别密切的帧,其实我们只需要保存一帧的数据,其它帧都可以通过这一帧再按某种规则预测出来,所以说视频数据在时间上的冗余是最多的。
  为了达到相关帧通过预测的方法来压缩数据,就需要将视频帧进行分组。

  帧分组算法是:在相邻几幅图像画面中,一般有差别的像素只有10%以内的点,亮度差值变化不超过2%,而色度差值的变化只有1%以内,我们认为这样的图可以分到一组。
  在这样一组帧中,经过编码后,我们只保留第一帖的完整数据,其它帧都通过参考上一帧计算出来。我们称第一帧为IDR/I帧,其它帧我们称为P/B帧,这样编码后的数据帧组我们称为GOP。
  在H264编码器中将帧分组后,就要计算帧组内物体的运动矢量了。H264编码器首先按顺序从缓冲区头部取出两帧视频数据,然后进行宏块扫描。当发现其中一幅图片中有物体时,就在另一幅图的邻近位置(搜索窗口中)进行搜索。

把运动矢量与补偿称为帧间压缩技术,它解决的是视频帧在时间上的数据冗余。除了帧间压缩,帧内也要进行数据压缩,帧内数据压缩解决的是空间上的数据冗余。

帧间编码:
  单项预测:计算当前帧F与前帧或后帧的运动矢量MV,由运动矢量预测当前帧的预测值F1,计算F与F1的残差,编码。编码需要保存每个像素的运动矢量和残差值。
  由于视频序列的连续性,当前块在不同的参考帧中的运动矢量也是有一定的相关性的。假定当前块所在帧的时间为 t, 则对应前面的多个参考帧的时间分别为: t-1, t-2, ……。则当在帧 t-2 中搜索当前块的最优匹配块时,可以利用当前块在帧 t-1 中的运动矢量 MV来估测出当前块在帧 t-2 的运动矢量。

  把运动矢量与补偿称为帧间压缩技术,它解决的是视频帧在时间上的数据冗余。除了帧间压缩,帧内也要进行数据压缩,帧内数据压缩解决的是空间上的数据冗余。
  H264的帧内压缩与JPEG很相似。一幅图像被划分好宏块后,对每个宏块可以进行 9 种模式的预测。

  经过帧内与帧间的压缩后,虽然数据有大幅减少,但还有优化的空间。对残差数据做DCT转换,可以将残差数据做整数离散余弦变换,去掉数据的相关性,进一步压缩数据。
  帧内压缩是属于有损压缩技术。也就是说图像被压缩后,无法完全复原。而CABAC属于无损压缩技术。无损压缩技术大家最熟悉的可能就是哈夫曼编码了,给高频的词一个短码,给低频词一个长码从而达到数据压缩的目的。MPEG-2中使用的VLC就是这种算法。
  CABAC也是给高频数据短码,给低频数据长码。同时还会根据上下文相关性进行压缩,这种方式又比VLC高效很多。

视频压缩标准的技术原理及其发展- https://blog.csdn.net/xjbclz/article/details/51854294?utm_source=blogxgwz2
 传统的压缩编码是建立在香农(Shannon)信息论基础上的,它以经典的集合论为基础,用统计概率模型来描述信源,但它未考虑信息接受者的主观特性及事件本身的具体含义、重要程度和引起的后果。因此,压缩编码的发展历程实际上是以香农信息论为出发点,一个不断完善的过程。 

- 从不同角度考虑,数据压缩缩码具有不同的分类方式:
 按信源的统计特性可分为预测编码、变换编码、矢量量化编码、子带-小波编码、神经网络编码方法等。
 数眼的视觉特性可能基于方向滤波的图像编码、基于图像轮廓-纹理的编码方法等。
 按图像传递的景物特性可分为分形编码、基于内容的编码方法等。

  GPEG专家组主要致力于静态图像的帧内压缩编码标准ISO/IEC10918的制定;MPEG专家组主要致力于运动图像压缩编码标准的制定。基于第一代压缩编码方法(如预测编码、变换编码、熵编码及运动补偿等)的三种压缩编码国际标准。静态图像压缩编码标准(JPEG);数字声像储存压缩编码标准(MPEG-1);通用视频图像压缩编码标准(MPEG-2)。 
  由于多媒体声音、数据、视像等信源数据有极强的相关性,也就是说有大量的冗余信息。数据压缩可以将庞大数据中的冗余信息去掉(去除数据之间的相关性),保留相互独立的信息分量

  运动估计和补偿:MPEG-4中提供了基于块的运动估计和补偿技术来有效地利用各个VOP中视频内容上的时间冗余。一般,运动估计和补偿可以看作针对任意形状图像序列的块匹配技术的延伸。块匹配过程对于标准宏块使用;预测误差和用于预测的宏块运动向量一起被编码;高级运动补偿模式支持重叠块运动补偿,可对8×8块运动向量进行编码。为了使运动估计得到高编码效率,预测图像和被预测图像越相似越好,所以在运动估计之前要先进行补偿。在目标边界上的MB先用水平填补而后用垂直填补,其余完全在VOP之外的MB用扩张填补。

 纹理编码:纹理指的是I-VOP图像和P/B-VOP经运动补偿后残留的图像信息。纹理一般在变换域进行压缩编码和熵编码。 
 被多媒体传输、存储、检索等应用普遍采用的统一数据格式。为支持对视频内容的访问,MPEG-4提出了“视频对象”的概念。 

 形状编码:形状信息的获得首先要对图形进行分析和分割,把各个代表不同内容的目标分割后再用形状表示。形状信息通常用二值Alpha平面和灰度Alpha平面来表示。二值Alpha平面可用临近信息进行算术编码(CAE);灰度Alpha平面可用运动补偿加DCT变换方式类似纹理编码一样进行编码。 
 其中用于图像压缩的变换有离散Forier变换(DFT)、离散小波变换(DWT)、奇异值分解(SVD)、K-L变换、Walsh变换、Hadamard变换、Harr变换、Slant变换、离散余弦变换(DCT)。其中K-L变换的去相关性最好,而DCT是接近K-L变换效果的最便于实现的变换。和MPEG-1/2一样,MPEG-4也选择了DCT。通常,用于数据压缩的熵编码方法有霍夫曼(Huffman)编码、矢量量化、算术编码、游程编码、LZW编码等。对于纹理编码,MPEG-4选择了把游程编码、矢量量化和Huffman编码进行混合编程编码(VLC)。纹理编码要经过DCT变换、量化、DC/AC预测、扫描、基于Hufman的VLC编码。

  伸屈性:视频的伸屈性,包括空间伸屈性和时间伸屈性。空间伸屈性可以得到不同的空间分辨率,时间伸屈性可得到不同的时间分辨率。每种伸屈都有多层,在只有高低2层的情况下,底层指的是基本层,而高层指的是增强层。

  差错回避:VLC码中的一个比特错误会引起同步丢失,而运动补偿则会引起错误传递。 MPEG-4的差错回避有三个方面:重同步、数据恢复和错误隐藏。 
  重同步,是指差错被检测后,解码器和码流之间重新同步的技术。一般来说,这种方法会将错误之前的同步点到重建的同步点之间的数据丢弃。不过这些丢弃的数据可以用其他的技术进行恢复和实施错误隐藏。
  数据恢复工具在解码器和码流重新建立起同步后用来恢复丢弃的数据。这些工具不是简单的用容错码恢复,而是用一种差错回避手段,即用可逆VLC码字进行VLC编码。 
  错误隐藏,在重同步有效地将错误定位后可以很容易处理。为了进一步提高错误隐匿的能力,有必要增加错误定位能力,特别是数据分割可以用来提高错误定位能力。

-- 2.1变换
  小波变换在低码率视频压缩技术中的应用。
  如果当前编码帧是I帧,则输入的数据先通过小波变换和量化,得到的小波系数按照重要性优先的原则经过熵编码后输出;如果当前编码帧是P帧,则输入的数据首先经过运动估计和运动补偿,得到运动矢量经过熵编码后输出,残差信号通过小波变换后编码输出。
  - 形状编码:形状信息的获得首先要对图形进行分析和分割,把各个代表不同内容的目标分割后再用形状表示。形状信息通常用二值Alpha平面和灰度Alpha平面来表示。二值Alpha平面可用临近信息进行算术编码(CAE);灰度Alpha平面可用运动补偿加DCT变换方式类似纹理编码一样进行编码。 
 其中用于图像压缩的变换有离散Forier变换(DFT)、离散小波变换(DWT)、奇异值分解(SVD)、K-L变换、Walsh变换、Hadamard变换、Harr变换、Slant变换、离散余弦变换(DCT)。其中K-L变换的去相关性最好,而DCT是接近K-L变换效果的最便于实现的变换。和MPEG-1/2一样,MPEG-4也选择了DCT。通常,用于数据压缩的熵编码方法有霍夫曼(Huffman)编码、矢量量化、算术编码、游程编码、LZW编码等。对于纹理编码,MPEG-4选择了把游程编码、矢量量化和Huffman编码进行混合编程编码(VLC)。纹理编码要经过DCT变换、量化、DC/AC预测、扫描、基于Hufman的VLC编码。

  变换类型:K-L变换;傅里叶变换;余弦变换;小波变换;

视频编解码学习之三:变换,量化与熵编码- https://www.cnblogs.com/xkfz007/archive/2012/07/29/2614250.html
变换编码:
  变换编码的目的
1.去除空间信号的相关性
2.将空间信号的能力集中到频域的一小部分低频系数上
3.能量小的系数可通过量化去除,而不会严重影响重构图像的质量
  块变换和全局变换
 块变换:离散余弦变换(Discrete Cosine Transform,DCT),4x4,8x8,16x16
 全局变换:小波变换(Wavelet)
  变换的能量集中特性:DCT编码

--2.2 量化处理,(语音识别,图像压缩)等

 量化Quantization:用更小的集合表示更大的集合的过程;对信号源的有限近似;有损过程;
 量化应用:A/D转换;压缩
 量化方法:标量(Scalar)量化;矢量(Vector)量化
 量化的基本思想:映射一个输入间隔到一个整数;减少信源编码的bit;一般情况重构值与输入值不同;

孤立词语音识别之Vector Quantization(矢量量化)- https://blog.csdn.net/zwhlxl/article/details/41679861
语音识别学习笔记(二)【基于矢量量化的识别技术- https://blog.csdn.net/xingxingdeyuanwang6/article/details/52787947
标量量化和矢量量化- https://blog.csdn.net/qingkongyeyue/article/details/52084012
矢量量化(Vector Quantization)- https://blog.csdn.net/zhenxin066/article/details/38959041

  量化分为标量量化和矢量量化(Vector Quantization,VQ)。标量量化是将采样后的信号值逐个进行量化,而适量量化是将若干个采样信号分成一组,即构成一个矢量,然后对此矢量一次进行量化。矢量量化实际是一种极其重要的信号压缩的方法,广泛应用于语音编码,语音识别和合成,图像压缩等领域。
  Vector Quantization(VQ)是一种基于块编码规则的有损数据压缩方法。在诸多领域有广泛应用,比如语音和图像编码或压缩,语音识别等领域。VQ 的 主要优点在于可以减少计算量和存储,缺点就是为了减少计算量和存储所付出的的代价,损失精度。
  爬山算法是一种简单的贪心搜索算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解。

  Vector Quantization 最优码本的建立常用算法是K-means和LBG算法。LBG算法是由Linde、Buzo和Gray 三人在1980年提出。LBG算法核心思想通过训练矢量集和一定的迭代算法来逼近最优的再生码本。
  K-means算法: 
1)初始化:选择合适的方法设置N个初始码本中心的码字ci,i ∈[1,N]; 
2)最近邻分类:将矢量源(训练数据)按照最近邻原则分配到“距离”最近的包腔内; 
3)码本更新:然后,根据质心原则重新计算每一个包腔内的码字,生成新的码本; 
4)结束:重复步骤2和3,直到相邻迭代误差的阈值达到一定要求。 
  LBG算法: 
K-means算法是在码书大小已知的情况下对样本聚类的方法,若不知码书大小,则需要用LBG算法: 
1)初始化: N=1, 计算初始码本中心c1; 
2)分裂: 将所有矢量源(训练数据)按照最近邻原则划分到N个包腔中,在对应的包腔中选择距离最远的两个训练数据矢量作为新的聚类中心,这样将N个包腔分裂成2N个包腔; 
3)K-means:按照2N个包腔,执行K-means方法达到收敛得到2N个聚类中心; 
4)结束:重复步骤2和3,直到达到要求的聚类中心个数或者误差达到要求。

--3. 熵编码
【Codecs系列】视频编码中常用熵编码介绍- https://blog.csdn.net/soaringlee_fighting/article/details/78303747
熵编码,熵(Entropy):信源的平均信息量,更精确的描述为表示信源所有符号包含信息的平均比特数
    信源编码要尽可能的减少信源的冗余,使之接近熵;用更少的比特传递更多的信源信息;
熵编码:数据压缩中根据信源消息的概率模型使消息的熵最小化
熵编码:无损压缩;变长编码

  1.熵编码:编码过程中按照熵原理不丢失任何信息的编码,即编码过程中不丢失信息量,保存信息熵。
  熵编码是无损压缩的编码方法。常见的熵编码方法:香农编码(shannon)、哈夫曼编码(huffman)、算术编码(arithmetic coding)、哥伦布编码(Golomb Codes)、游程编码等。
  2.可变长编码(Variable Length Coding,VLC):可变长编码通过给出现概率大的符号赋予较短的码字,改变码字长度达到压缩信息冗余的目的,编码和解码过程完全可逆,又称为统计编码和无失真的压缩编码方法。最常用的可变长编码为Huffman、哥伦布编码、游程长度编码。
  3、算术编码(Arithmetic coding):算术编码的本质是对输入流分配一个码字,而不是为每个符号分配一个码字。算术编码对整条信息(无论多长),其输出仅仅是一个小数,而且是介于0和1之间(半开区间[0,1))的二进制小数。如果算术编码对某条信息的输出为1010001111,那么表示的是小数0.1010001111,换算成十进制即为0.64。
  算术编码不是单独对一个码字进行编码,而是对整条信息进行编码。

数字视频编码概述(熵编码/Huffman编码)- https://blog.csdn.net/u013354805/article/details/50112353
  按ITU-R BT. 601建议,数字化后的输入图像格式为720*576像素,帧频为25帧/s,采样格式为4:2:2,量化精度为8bit,
则数码率:(720 * 576 + 360 * 576 + 360 * 576) * 25帧/s * 8bit = 165.888Mbit/s。
如果视频信号数字化后直接存放在650MB的光盘中,在不考虑音频信号的情况下,每张光盘只能存储31s的视频信号。
  数据压缩的理论基础是信息论。从信息论的角度来看,压缩就是去掉数据中的冗余,即保留不确定的信息,去掉确定的信息(可推知的),也就是用一种更接近信息本质的描述来代替原有冗余的描述。数据图像和视频数据中存在着大量的数据冗余和主观视觉冗余
  1.1 空间冗余:空间冗余也称空域冗余,是一种与像素间相关性直接联系的数据冗余。例如:数字图像的亮度信号和色度信号在空间域(X,Y坐标系)虽然属于一个随机场分布,但是他们可以看成为一个平稳的马尔可夫场。通俗讲,图像像素点在空间域中的亮度值和色度信号值,除了边界轮毂外,都是缓慢变化。因此,图像的帧内编码,即以减少空间冗余进行数据压缩。
  1.2 时间冗余:时间冗余也称为时域冗余,它是针对视频序列图像而言的。视频序列每秒有25 ~ 30帧图像,相邻帧之间的时间间隔很小(例如,帧频为25Hz的电视信号,期帧间间隔只有 0.04s),使得图像有很强的相关性。因此,对于视频压缩而言,通常采用运动估值和运动补偿预测技术来消除时间冗余。
  1.3 统计冗余:统计冗余也称编码表示冗余或符合冗余。由信息论的有关原来可知,为了表示图像数据的一个像素点,只要按其信息熵的大小分配相应的比特数即可。若用相同码长表示不同出现概率的符号,则会造成比特数的浪费。如果采用可变长编码技术,对出现概率大的符号用短码字表示,对出现概率小的符号用长码字表示,则可去除符号冗余,从而节约码字,这就是熵编码的思想。
  1.4 结构冗余:在有些图像的部分区域内有着很相似的纹理结构,或是图像的各个部分之间存在着某种关系,例如自相似性等,这些都是结构冗余的表现。分形图像编码的基本思想就是利用了结构冗余。
  1.5 知识冗余:在某些特定的应用场合,编码对象中包含的信息与某些先验的基本知识有关。这时,可以利用这些先验知识为编码对象建立模型。通过提取模型参数,对参数进行编码,而不是对图像像素值直接进行编码,可以达到非常高的压缩比。这是模型基编码(或称知识基编码、语义基编码)的基本思想。
  1.6 人眼的视觉冗余:视觉冗余度是相对于人眼的视觉特性而言。压缩视觉冗余的核心思想是去掉那些相对人眼而言是看不到的或可有可无的图像数据。对视觉冗余的压缩通常反映在各种具体的压缩编码中。如对于离散余弦变换(DCT)系数的直流与低频部分采用细量化,而对高频部分采用粗量化。在帧间预测编码中,高压缩比的预测帧及双向预测帧的采用,也是利用了人眼对运动图像细节不敏感的特性。

  熵指的是具体数据所含的平均信息量,定义为在不丢失信息的前提下描述该信息内容所需的最小比特数。熵编码事纯粹基于信号统计特性的一种编码方法,他利用信源概率分布的不均匀性,通过变长编码来减少信源数据冗余,解码后还原的数据与压缩编码前的原始数据完全相同而不引入任何失真。
  从信息论的角度出发,根据解码后还原的数据是否与原始数据完全相同,可将数据压缩方法分为两大类:无失真编码和限失真编码。
  最常用的无失真编码方法有哈夫曼(Huffman)编码、算术编码和游程编码(Run-Length Encoding,RLE)等。常见的限失真编码方法:预测编码、变化编码、矢量量化、基于模型编码等。

理解视频编码中的熵编码- https://blog.csdn.net/lrzkd/article/details/79861141

--4. 环路滤波器Loop Filter,视频编解码环路内滤波实现
  现有的视频编解码算法有编码器和解码器两个主要组成部分:编码器负责把输入视频根据视频编码标准编码成比特流,而解码器负责对比特流进行解码得到最终的解码视频。在编解码过程中,编解码环路外滤波器和环路内滤波器被使用来提升重建视频帧的图像质量。
  现有的环路内滤波器使用了Deblock Filter和Sample Adaptive offset Filter作为环路滤波器,即在编码的过程中,对重建图像进行滤波,改善图像质量。环路内滤波器的特点是在帧间参考模式下,当前重建帧会作为后续编码帧的参考帧,从而环路内滤波器会影响编码的后续过程。现有的环路外滤波器使用卷积神经网络作为环路外滤波器,对于帧内参考模式下的重建帧进行处理,一定程度上提升了编码效率。但是由于帧内参考模式的局限性,压缩比非常有限,并且环路外滤波器对于重建帧的质量提升对后续的编码过程不会产生增益,因此从这一角度来说,该算法对于编码效率的改进非常有限。

数字滤波器的 32 位过采样 ADC;

  由于FDCT变换后的量化(Quant)过程是一个有损(lossy)过程,会照成信息损失。再经过反量化(Rescale)和IDCT后恢复的矩阵与原矩阵存在一定的误差,特别宏块的边界,会照常恢复的图像呈现方块化,而方块化的图片对于后面的图片预测存在极大的影响,所以我们需要通过环路滤波进行去方块化
 真边界:即原图像所存在的纹理细节。例如上图foreman的脸部边界
 假边界:即原图像平坦区域由于量化操作而导致块边界失真,相邻块之间过度不平滑,呈现出来的边界。

  HEVC中两种环路滤波技术:DeBlock(去块效应)滤波和SAO(样点自适应补偿)滤波。  去块效应滤波器用于去除视频中的块效应。HEVC的去块效应滤波器和H.264中的去块效应滤波器是类似的。在HEVC中,去块效应滤波是以8x8的块为单位的,注意在实际处理的时候是将8x8的块边界上的像素分成2个4x4块独立进行处理的。
  “滤波强弱”和“边界强弱”要区分开。“边界强弱”影响滤波公式的阈值,而“滤波强弱”决定了滤波公式。滤波强弱可以分成强滤波和普通滤波两种。  HEVC中允许使用较大的块进行DCT变换,这一方面能够提供更好的能量集中效果,但是另一方面在量化后却会带来更多的振铃效应。典型的振铃效应。SAO(样点自适应补偿)滤波就是为消除这种振铃效应而设计的。它通过对重建图像的分类,对每一类图像像素值加减一个偏移,达到减少失真的目的。在HEVC中包含了两种像素值补偿方法:边界补偿(Edge Offset,EO)以及边带补偿(Band Offset,BO)。在HEVC中SAO是以CTU为基本单位的。

FFmpeg的HEVC解码器源代码简单分析:环路滤波(Loop Filter)- https://blog.csdn.net/leixiaohua1020/article/details/46483721
  几个用于环路滤波的函数:
HEVCDSPContext->sao_band_filter():SAO滤波边带补偿函数。C语言版本函数为sao_band_filter_0_8()
HEVCDSPContext->sao_edge_filter[]():SAO滤波边界补偿函数。C语言版本函数为sao_edge_filter_0_8()等
HEVCDSPContext-> hevc_h_loop_filter_luma():去块效应滤波水平边界亮度处理函数。C语言版本函数为hevc_h_loop_filter_luma_8()
HEVCDSPContext-> hevc_v_loop_filter_luma():去块效应滤波垂直边界亮度处理函数。C语言版本函数为hevc_v_loop_filter_luma_8()
HEVCDSPContext-> hevc_h_loop_filter_chroma():去块效应滤波水平边界色度处理函数。C语言版本函数为hevc_h_loop_filter_chroma_8()
HEVCDSPContext-> hevc_v_loop_filter_chroma():去块效应滤波水平边界色度处理函数。C语言版本函数为hevc_v_loop_filter_chroma_8()

  类似于以往的视频编码标准,HEVC仍采用基于块的混合编码框架,一些失真效应仍然存在,如方块效应、振铃效应、颜色偏差以及图像模糊等等。为了解决这些问题,HEVC中采用了环路滤波技术,它其实是一种用于解码端的后处理滤波技术,主要包括去块滤波(Deblocking Filter,DBF)和样点自适应补偿(Sample Adaptive Offset,SAO)。其中,DBF的作用与H.264类似,主要是去除块效应,但是相比于H.264,其决策与滤波过程大大地被简化了,而SAO是HEVC中的新技术。
 
环路滤波- https://www.jianshu.com/p/4223d5448081 
  样点自适应补偿(SAO)- 振铃效应:对于图像里的强边缘,由于高频交流系数的量化失真,解码后在边缘周围产生的波纹现象。
  H.265/HEVC标准中的SAO以CTB为基本单位,通过选择合适的分类器将重建像素划分类别,然后对不同类别像素使用不同的补偿值,可以有效的提高视频的主客观质量。其主要分为边界补偿(Edge Offset,EO)和边带补偿(Band Offset,BO)两类。
  边界补偿: 边界补偿分为水平方向(EO_0)、垂直方向(EO_1)、135度方向(EO_2)、45度方向(EO_3)四种模式,在任意一种模式下,根据一定条件将重构像素分为5个不同种类,不同种类的像素才用不同的补偿值,同一种类必须采用相同的补偿值。
同时,补偿值的符号与其种类强相关,所以按照不同种类对补偿值的符号进行了限制:种类1、2补偿值大于等于0,种类3、4小于等于0。
  边带补偿:边带补偿技术根据像素强度值对归类,将像素范围等分成32条边带。
一般同一个CTB中大多数像素属于少数几个边带,标准规定一个CTB只能选择4条连续的边带,并只对属于这4个边带的像素进行补偿。选择哪4条边带可以通过率失真优化方法确定。
  SAO参数融合:参数融合(Merge)是指对于一个CTB块,其SAO参数直接使用相邻块的SAO参数。如果使用参数融合,亮度和色度分量必须同时使用同一个相邻块(同时使用左相邻块或同时使用上相邻块)的补偿参数。

AV1:下一代视频标准—约束定向增强滤波器-https://blog.csdn.net/vn9PLgZvnPs1522s82g/article/details/81025198
      https://hacks.mozilla.org/2018/06/av1-next-generation-video-the-constrained-directional-enhancement-filter/
  所有的视频编解码器都使用增强滤波器来改善主观输出质量。 增强滤波器旨在减轻或消除客观指标盲目的,但对人眼来说是显而易见的特定伪像。因此,即使滤波是作弊的一种形式,一个好的视频编解码器也需要它可以利用所有的实用有效的作弊手段。
  在过去的二十年中,视频编解码器研究越来越多地关注本质上带有方向性的变换,滤波和预测方法,以便更好地表示方向性的边缘和模式,并纠正DCT的这一基本限制。

  定向帧内预测是现代视频编解码器中使用的最著名的定向技术之一。我们都熟悉H.264和VP9的方向性预测模式,编解码器会基于已解码块周围的像素来预测方向模式。目的是在变换之前去除(或大大减少)方向性边缘中包含的能量。通过预测或去除无法压缩的特征,我们可以提高编解码器的整体效率。  运动补偿,也可以算作一种方向预测。它是在特定方向上移动块,也是在DCT之前预测消除冗余。块的匹配是指向性的并在滤波之后完成。和帧内方向预测一样,当匹配位置不是整像素时,会用到插值滤波器。
  视频编解码器大量使用滤波操作来消除块效应和基底噪声。尽管滤波器是用于二维平面,但滤波器本身往往可分解为水平滤波和垂直滤波两步。
  定向滤波技术尝试在非水平或垂直的方向上进行滤波。该技术在图像处理中已经很常见,其中噪声消除和特殊效果滤波器通常是边缘和方向感知的。然而,这些定向滤波器通常是基于对定向变换的输出进行滤波。例如,我之前基于双树复数小波变换编写的图像去噪滤波器。
  定向变换试图在其自身变换过程中解决DCT变换的边缘压缩问题。 推动CDEF的视觉改进大多是在原始客观测试工具(如PSNR或SSIM)的评估能力之外。

h.264 去块滤波- https://www.cnblogs.com/TaigaCon/p/5500110.html
  h.264在编码过程中对像素残差进行了DCT变换,变换后得到的DCT系数是与每个像素都相关的,这些系数代表了被变换数据的基础色调与细节。h.264在DCT变换后对DCT系数进行了量化,量化能有效去除相邻像素间的空间冗余,也就是说会抹去元素数据的部分细节。比较理想的情况是量化抹去人眼无法识别的细节部分,但是在低码率的情况下就会导致原始数据的细节丢失过多。而且,DCT变换时基于块的,即将8x8或者4x4的像素残差进行变换后得到8x8或者4x4DCT系数,此时如果进行了低码率的量化,就会使得相邻两个块的相关性变差,从而出现块效应。
  h.264的运动补偿加剧了由变换量化导致的块效应。由于运动补偿块的匹配不可能绝对准确,各个块的残差大小程度存在差异,尤其是当相邻两个块所用参考帧不同、运动矢量或参考块的差距过大时,块边界上产生的数据不连续就更加明显。
  块效应主要有两种形式:一种是由于DCT高频系数被量化为0,使得强边缘在跨边界处出现锯齿状,称为梯形噪声;另一种经常出现在平坦区域,由于量化导致本来平缓变换的亮度块DC系数发生跳跃,造成变换块的基础色调改变,这种称为格形噪声。 为了减轻和消除视频图像中的块效应,通常会使用滤波器对块边界处的像素进行滤波以平滑像素值的突变,这种滤波被称为去块滤波器(Deblocking Filter)。
  环路滤波器是被放置在编解码的图像重建环路当中。在启用了环路滤波的编解码环境中,无论是编码器还是解码器,都是在图像被重建后才进行滤波。在编码器中,滤波后的图像会作为后续编码运动补偿的参考图像;在解码器中,滤波后的图像会被输出显示并且作为后续图像解码重建的参考图像。
  块效应是由于对块(block)进行DCT变换量化产生的,去块滤波的目的是消除块效应,因此去块滤波需要正确地定位出进行DCT变换量化的块。在帧场自适应的编码环境下,宏块可以以帧或者场的方式进行编码,但是在宏块进行重建后得到的都是帧宏块,因此我们需要根据实际情况定位出当时进行DCT变换量化的块所在的像素。

 环路滤波器在整个电路中主要作为一个低通滤波器,它将芯片鉴相器输出的脉冲信号进行低通滤波,将高频分量滤除,最终得到一个相对平滑的直流电压信号去控制VCO工作,从而获得一个稳定的频率输出。环路滤波器的性能将直接影响到小数分频频率合成器芯片性能的测试。 

环路滤波(In-Loop Filtering)技术- https://www.cnblogs.com/tiansha/p/6458461.html
 去块滤波(Deblocking Filter,DBF)用于降低方块效应(所谓方块效应就是图像中编码块边界的不连续性),造成方块效应的主要原因有三个:
①、各个块的变换、量化编码过程相互独立(相当于对各个块使用了不同参数的滤波器分别滤波,因此各块引入的量化误差大小及其分布特性相互独立,导致相邻块边界的不连续);
②、运动补偿预测过程中,相邻块的预测值可能来自于不同图像的不同位置,导致预测残差信号在块边界产生数值的不连续;
③、时域预测技术使得参考图像中存在的边界不连续可能会传递到后续编码图像。

1.去块滤波技术
  在H.264中,DBF应用于4x4大小块,而在HEVC中,无论亮度还是色度样本均只应用于8x8大小块。这一限定可以在不影响视觉质量的情况下,降低计算复杂度,同时通过防止相邻滤波操作之间的交互,便于并行处理的实现。
  在HEVC中,DBF的处理顺序是:首先对整个图像的垂直边缘进行水平滤波,然后对水平边缘进行垂直滤波。该顺序使得多次水平滤波或者垂直滤波过程可以通过并行处理实现,或者仍可以以逐CTB的方式执行,这时会引入很小的处理延迟。
  总结一句,对块边界进行平滑滤波可以有效地降低、去除方块效应。

2.样点自适应补偿(Sample Adaptive Offset,SAO)
  样点自适应补偿(Sample Adaptive Offset,SAO)用于改善振铃效应,SAO被自适应地用于所有满足特定条件的样本上。
  造成振铃效应的原因是:高频信息的丢失(HEVC仍采用基于块的DCT变换,并在频域对变换系数进行量化,对于图像里的强边缘,由于高频交流系数的量化失真,解码后会在边缘周围产生波纹现象,即吉布斯现象,如下图所示,这种失真就是振铃效应,振铃效应会严重影响视频的主客观质量)。
  正是由于高频信息的丢失才导致的振铃效应,因此要抑制振铃效应,就必须减小高频分量的失真,而直接精细量化高频分量势必导致压缩效率的降低。
  SAO的解决方法如下(基本原理):从像素域入手降低振铃效应,对重构曲线中出现的波峰像素添加负值进行补偿,波谷添加正值进行补偿,由于在解码端只能得到重构图像信息,因此可以根据重构图像的特征点,通过将其划分类别,然后在像素域进行补偿处理。
  在HEVC中,SAO以CTB为基本单位,通过选择一个合适的分类器将重建像素划分类别,然后对不同类别像素使用不同的补偿值,可以有效提高视频的主客观质量。它包括两大类补偿形式,分别是边界补偿(Edge Offset,EO)和边带补偿(Bang Offset,BO),此外还引入了参数融合技术。

- HEVC的环路滤波
  HEVC的环路滤波包括两个部分:去方块滤波(deblocking filter)和样本自适应缩进滤波(sample adaptive offset filter,简称SAO)。   滤波类型(edgeType)分为垂直(EDGE_VER)和水平(EDGE_HOR),值分别为0和1。
- ffmpeg 264 环路滤波
(1)普通滤波器。针对边界的Bs(边界强度)为1、2、3的滤波器。
(2)强滤波器。针对边界的Bs(边界强度)为4的滤波器。
与帧内预测相关的图像块(帧内预测块)的边界强度比较大,取值为3或者4;与运动补偿相关的图像块(帧间预测块)的边界强度比较小,取值为1。

你可能感兴趣的:(音视频方案,个人研究与计划)