振铃效应与样点自适应补偿(Sample Adaptive Offset,SAO)技术

SAO(Sample Adaptive Offset,自适应样点补偿)原理分析

🐋 🐬 🐶 🐳 🐰 🦀

1. H265压缩原理

🐋 SAO是H265视频压缩协议中用于补偿重建图像的一种技术。而H265压缩可以简单理解为对图像的一些特征的提取,解码端可以根据这些特征信息来恢复图像。

🐋 假设原始图像为x,压缩后的图像为y。 令 y = f ( x ) y = f(x) y=f(x),但是 x ! = f − 1 ( y ) x != f^{-1}(y) x!=f1(y), 比如 y = f ( x ) = x > 0 ? 1 : 0 y = f(x) = x>0 ? 1 : 0 y=f(x)=x>0?1:0; 我们无法根据压缩后的图像y,来完整的还原原始图像x,两张图像总是有些误差的,而SAO就是为了在一定程度上弥补这个误差。

2. SAO的作用

🐬 Sao简单来说就是对图像里的像素点进行分类,选取某类的像素点进行补偿(加一个offset)。怎么分类,和对哪一类像素点进行补偿,offset的值怎么确定,就是SAO了
🐬 上一节提到过, x ! = f − 1 ( y ) x != f^{-1}(y) x!=f1(y),SAO就是对重建图像 f − 1 ( y ) f^{-1}(y) f1(y)进行补偿,使其更接近原始图像x;也就是说,SAO的作用就是在一定程度上弥补两个图像的误差

3. SAO原理简介

上节提到过,sao主要就三个问题。

  • 🐶1. 怎么分类;
  • 🐶2. 需要对哪一类像素点进行补偿(不需要每个像素点都补偿,既浪费资源,意义也不大,人眼也捕捉不到这细微的差别);
  • 🐶3. 需要补偿的那几个分类的像素点的offset怎么确定。

SAO有两种方式进行分类,一种是EO模式(Edge offset),一种是BO(Band offset)模式

4. SAO的分类–BO

BO模式比较好理解,就是根据像素点数值来进行分类;比如像素点的取值范围为0-255(8bit);

  • 🐳 将值在[0 - 7]的像素点记为 B O 0 BO_0 BO0分类,[8 - 15] 的像素点记为 B O 1 BO_1 BO1分类;依次类推,可以得到32个分类 B O 0 BO_0 BO0, B O 1 BO_1 BO1, … B O 3 1 BO_31 BO31;
  • 🐳统计每个分类的像素点个数N0, N1,… N31, 以及每个分类像素点,和原始图像对应的误差之和E0, E1, E2.。。E31;
  • 🐳之后可以确定每个分类的补偿值的取值范围,比如B0分类的取值范围为【0, E0/N0】;
  • 🐳采用这个offset进行补偿时,原始图像x和重建图像y的差异,我们用 δ d \delta_d δd表示,计算公式为: δ d = N ∗ o f f s e t 2 − 2 o f f s e t ∗ E \delta_d=N*offset^{2}-2offset*E δd=Noffset22offsetE
  • 🐳采用这种编码方式所需要的存储资源(牵扯到cabac熵编码)记为R; SAO选取代价函数 δ j \delta_j δj来衡量 δ d \delta_d δd和R这两个指标, δ j = δ d + λ R \delta_j=\delta_d+\lambda R δj=δd+λR, 其中lambda取值越大,SAO越倾向于压缩后的数据R更小, lambda取值越小,SAO更倾向于使图像失真更小;
  • 🐳则对 B O 0 BO_0 BO0分类,计算取值范围内的每一个值对应的代价函数,得到代价函数最小的offse,依次类推;我们能得到32个分类的offset;
  • 🐳一般H265处理时,将图像划分成多个ctb块,一个ctb最大64*64个像素点;而一般情况下,一个ctb的像素点取值大多在连续4个的BO分类里,比如 B O 0 BO_0 BO0 ~ B O   3 BO~3 BO 3; 因此我们只需要对32个分类里的某个连续4个的分类进行补偿即可;
  • 🐳如果对 B O 0 BO_0 BO0~ B O 3 BO_3 BO3进行补偿,代价函数为 δ j 0 \delta_{j0} δj0+ δ j 1 \delta_{j1} δj1+ δ j 2 \delta_{j2} δj2+ δ j 3 \delta_{j3} δj3
  • 🐳依次类推,可以得到29组代价函数;我们选取最小的一组代价函数,就完成BO补偿;

例如我们最终选择BO2 - BO5代价函数最小,SAO输出的值是
Mode : 1; (BO模式)
Band_position: 2; (起始位置为2)
Offset:【0, 2, 2, 5】

最终恢复图像时,

  • 我们将图像像素点大小在【16,23】之间的,全部加0,
  • 【24,31】之间的全部加2,
  • 【32,39】之间的全部加2,
  • 【40,47】之间的全部加5;

5. SAO的分类–EO

EO分类的分类依据是,由于sao模块输入的图像存在振铃效应,这是由H265中其他模块(deblock)导致的,如图所示:
请添加图片描述

因此sao中提出了四种角度分类方式,记为EO0, EO1, EO2,EO3,
请添加图片描述

根据四种分类方式,对图像的各个像素点进行分类;
请添加图片描述

  • 🦀如果使用EO0方式进行分类,需要补偿的点为EO0_0, EO0_1, EO0_2, EO0_3;
  • 🦀这四种方式的offset值的选取与上节的BO一样,其代价函数之和记为ΔJ_eo0;
  • 🦀同理,使用EO1,EO2, EO3方式进行分类,分别可得另外3种分类补偿方式的代价函数ΔJeo0,….
  • 🦀选取最小的代价函数的补偿方式;

例如我们最终选择delta_j_2_23 代价函数最小,SAO输出的值就是
Mode : 2;
EO_class: 2;
Offset:【0, 2, 2, 5】

最终恢复图像时,我们将图像像素点以EO2的角度进行划分,及每个像素点c分别和左上角a,右下角b的相邻像素点进行比较分类;

  • 🦀大小关系为上图的种类1的,全部加0;
  • 🦀大小关系为上图的种类2的,全部加2,
  • 🦀大小关系为上图的种类3的,全部加2,
  • 🦀大小关系为上图的种类5的,全部加5,

6. Not APPlied和merge模式

Not applied就是不做补偿的意思;不做补偿的offset就是0,那么ΔD也是0,但是 mode信息还是需要编码的,因此代价函数 δ J = λ R \delta_J =\lambda R δJ=λR,,此外sao还提供了merge模式,即,直接使用上方或者左边块的sao补偿方式。

7. 最终补偿模式的选择

H265在压缩图片时,将一帧视频的图片分割成许多64*64或者其他大小的碎片(CTU),而SAO是以CTU为单位的进行分类的。SAO大概可分为以下5种类型:

  • 🐰 Not Applied : 表示该CTU不需要进行补偿;
  • 🐰 Merge Up : 表示该CTU和他上面那块的CTU采用同样的补偿方式;
  • 🐰 Merge Left : 表示该CTU和他左面那块的CTU采用同样的补偿方式;
  • 🐰 Edge Offset (EO): 根据每个像素点和他附近像素点的关系,将其分为5类,其中4类需要补偿,为每类设置一个合适的offset。
  • 🐰 Band offset(BO): 根据每个像素点的大小进行分类,分为32个区间,为每个区间选择一个合适的offset。

EO,BO, Not applied , merge_up, merge——left,这五种方式,SAO会选择代价函数 δ j \delta_j δj最小的方式进行补偿。

8. 总结

SAO是根据H265中,重建图像和原始图像差异的特性,来尽可能的弥补这个差距,使得重建图像更接近原始图像。
对各个需要补偿的点(与原始图像有偏差)进行分类,为每个分类设置一个合适的偏移值(offset),这样解码端就能根据编码端传输过来的几个offset值和分类方式来恢复图像了。

9. 参考资料

【1】CSDN博客: H.265/HEVC编码原理及其处理流程的分析
【2】.新一代高效视频编码H.265/HEVC:原理、标准与实现,作者:万帅、杨付正;

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮皮宽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值