SAD和SATD的区别与几个名词解释

本文详细解析了SAD(绝对误差和)与SATD(哈达玛变换后的残差绝对和)在视频编码中的应用与区别,特别是它们在运动估计、帧内预测和模式选择中的作用。同时,介绍了不同场景下选择SAD或SATD的原因,以及算术名词的解释,包括SSD、MAD、MSD等。此外,阐述了在不使用率失真最优化时,如何利用SATD和相关参数作为模式选择依据,并讨论了不同编码方式(如cavlc和cabac)下对码流和重建图像的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

SAD和SATD的区别与几个名词解释

Q:如果不用率失真最优化,为什么选择SATD+delta×r(mv,mode)作为模式选择的依据?为什么运动估计中,整象素搜索用SAD,而亚象素用SATD?为什么帧内模式选择要用SATD?
A:
   SAD即绝对误差和,仅反映残差时域差异,影响PSNR值,不能有效反映码流的大小。SATD即将残差经哈德曼变换的4×4块的预测残差绝对值总和,可以将其看作简单的时频变换,其值在一定程度上可以反映生成码流的大小。因此,不用率失真最优化时,可将其作为模式选择的依据。
   一般帧内要对所有的模式进行检测,帧内预测选用SATD的原因同上。
   在做运动估计时,一般而言,离最优匹配点越远,匹配误差值SAD越大,这就是有名的单一平面假设,现有的运动估计快速算法大都利用该特性。但是,转换后SATD值并不满足该条件,如果在整象素中运用SATD搜索,容易陷入局部最优点。而在亚象素中,待搜索点不多,各点处的SAD差异相对不大,可以用SATD选择码流较少的匹配位置。
    ·几种常见的算术名词缩写。
SAD(Sum of Absolute Difference)=SAE(Sum of Absolute Error)即绝对误差和
SATD(Sum of Absolute Transformed Difference)即hadamard变换后再绝对值求和
SSD(Sum of Squared Difference)=SSE(Sum of Squared Error)即差值的平方和
MAD(Mean Absolute Difference)=MAE(Mean Absolute Error)即平均绝对差值
MSD(Mean Squared Difference)=MSE(Mean Squared Error)即平均平方误差

众所周知,评价编码效率的有两大指标:码率和PSNR。码流越小,则压缩率越大;PSNR越大,重建图像越好。在模式选择的时候,判别公式实质上也就是对二者的综合评价。

首先以RDO为例,模式对应的代价:J(mode)=SSD+λ*R(ref,mode,mv,residual)

这里,SSD是指重建块与源图像的差值均方和;λ是拉格朗日乘子,就当是权值吧^_^;R就是该模式下宏块编码的实际码流,包括对参考帧、模式、运动矢量、残差等的比特总和。当然如果是帧内模式,就只有R(mode,residual)。

很多人迷惑的是,改宏块还没编码啊,怎么知道它的码流和重建图像?实际上,RDO就是对每个模式都实际编码一次,得到J(mode),然后选择J(mode)最小的模式为实际编码模式。就像编码器引入了一个大反馈,这也正是JM选用RDO编码起来龟速的原因,当然,编码效率最佳。

后来,“随意”注意到,不论熵编码选用cavlc还是cabac,各个模式下的residual编码都使用cavlc,这就是说选用cabac,模式选择时得到的R不是实际的R,为什么此时不用cabac呢?难道cabac复杂么?我的看法是因为cabac会对模型表更新数据。解码端是没有模式选择模块的,如果编码端此时使用cabac,会造成编解码端模型表不匹配,不能正常解码。

λ的取值是根据实验得到的。使用B帧与使用B帧的λ值是不一样的。具体值忘了,^_^,看相关文章。

前已所述,RDO包含各模式的实际编码过程,也就是变换量化、熵编码、反变换反量化、重建等,计算量是相当大的,实时编码领域不可能直接使用。因此,就有了下面的替代公式:

J(mode)=SAD+λ*R(ref,mode,mv)

J(mode)=SATD+λ*R(ref,mode,mv)

这里SAD就是该模式下预测块与源图像的绝对误差和。比特R中少了对residual的编码,也就是运动估计后就可以直接得到该模式的J(mode)值,极大的减少了运算复杂度。SATD就是对残差进行哈德曼变换后的系数绝对和,在大多数情形下,SATD比SAD评价效果更好些,我对foreman CIF图像的测试,psnr增加了约0.2db,码流差不多。当然,SATD比SAD多了个变换,计算量大些。

注意,此时的λ与RDO的λ取值是不一样的。

容易困惑的还有,运动估计的匹配准则,很多运动估计的论文中都直接是SAD或SSE。编码器中对残差、MV、ref都要编码,所以匹配准则也就是SAD和码流R的综合评价!!!在同一个模式下,参考块与编码块的不同信息有ref、MV,故匹配准则为:

Jmotion=SAD+λ*R(ref,mv)

 

最后,附上我以前在群“H264乐园”中的帖子,

Q:如果不用率失真最优化,为什么选择SATD+delta×r(mode,ref,mv)作为模式选择的依据?为什么运动估计中,整象素搜索用SAD,而亚象素用SATD?为什么帧内模式选择要用SATD?

A:
   SAD即绝对误差和,仅反映残差时域差异,影响PSNR值,不能有效反映码流的大小。SATD即将残差经哈德曼变换的4×4块的预测残差绝对值总和,可以将其看作简单的时频变换,其值在一定程度上可以反映生成码流的大小。因此,不用率失真最优化时,可将其作为模式选择的依据。
   一般帧内要对所有的模式进行检测,帧内预测选用SATD的原因同上。
   在做运动估计时,一般而言,离最优匹配点越远,匹配误差值SAD越大,这就是有名的单一平面假设,现有的运动估计快速算法大都利用该特性。但是,转换后SATD值并不满足该条件,如果在整象素中运用SATD搜索,容易陷入局部最优点。而在亚象素中,待搜索点不多,各点处的SAD差异相对不大,可以用SATD选择码流较少的匹配位置。

### MR-SAD MR-SATD 算法原理及实现 #### MR-SAD(Mean of Residual - Sum of Absolute Difference) MR-SAD 是一种改进的误差计算方法,通常用于运动估计或图像配准等任务中。传统的 SAD(Sum of Absolute Difference)相比,MR-SAD 考虑了残差信号的均值特性。在某些应用场景中,例如 LIC(Luma Mapping with Chroma scaling)被启用的情况下,MR-SAD 被用来替代传统的 SAD 进行整像素亚像素运动搜索。 **算法原理:** - MR-SAD 的核心思想是将预测块参考块之间的差异(即残差)进行归一化处理。 - 具体来说,它通过减去残差的均值得到“均值残差”,然后计算该均值残差的绝对值之。 **公式表示如下:** 假设预测块为 $ P(x,y) $,参考块为 $ R(x,y) $,则传统 SAD 表达式为: $$ SAD = \sum_{x,y} |P(x,y) - R(x,y)| $$ 而 MR-SAD 则为: $$ MR\text{-}SAD = \sum_{x,y} |(P(x,y) - R(x,y)) - \mu_{res}| $$ 其中 $ \mu_{res} $ 是残差块的平均值 [^2]。 **实现步骤:** 1. 计算预测块参考块之间的残差。 2. 求出残差块的均值 $ \mu_{res} $。 3. 对每个残差点减去均值后取绝对值并求。 #### MR-SATD(Mean of Residual - Sum of Absolute Transformed Difference) MR-SATDSATD(Sum of Absolute Transformed Difference)的一种扩展形式,常用于率失真优化(Rate-Distortion Optimization, RDO)中。当 LIC 应用于一个 CU(Coding Unit)时,在整像素亚像素运动搜索过程中会使用 MR-SATD 来代替 SATD [^3]。 **算法原理:** - MR-SATD 首先对残差信号进行哈达玛变换(Hadamard Transform),然后计算变换后的系数绝对值之。 - MR-SAD 类似,MR-SATD 同样考虑了残差的均值信息,并将其从残差中去除后再进行变换误差计算。 **公式表示如下:** 设残差块为 $ E(x,y) = P(x,y) - R(x,y) $,其均值为 $ \mu_{res} $,则修正后的残差为: $$ E'(x,y) = E(x,y) - \mu_{res} $$ 随后对 $ E'(x,y) $ 进行哈达玛变换得到频域系数 $ T(E') $,最终 MR-SATD 值为: $$ MR\text{-}SATD = \sum |T(E')| $$ **实现步骤:** 1. 计算预测块参考块之间的原始残差。 2. 求出残差的均值并从中减去以获得均值归零的残差。 3. 对该残差执行哈达玛变换。 4. 计算变换后系数的绝对值之作为 MR-SATD 值 [^1]。 #### 实现代码示例(Python) 以下是一个简化的 Python 实现示例,展示如何计算 MR-SAD MR-SATD: ```python import numpy as np from numpy.fft import dct # 使用 DCT 模拟哈达玛变换,实际应使用 Hadamard 变换 def compute_mr_sad(pred_block, ref_block): residual = pred_block - ref_block mean_residual = np.mean(residual) mean_removed_residual = residual - mean_residual mr_sad = np.sum(np.abs(mean_removed_residual)) return mr_sad def hadamard_transform_2d(matrix): """Perform 2D Hadamard transform on a matrix.""" n = matrix.shape[0] hmat = np.kron([[1, 1], [1, -1]], np.ones((n//2, n//2))) transformed = np.dot(hmat, matrix).dot(hmat.T) return transformed def compute_mr_satd(pred_block, ref_block): residual = pred_block - ref_block mean_residual = np.mean(residual) mean_removed_residual = residual - mean_residual # Apply 2D Hadamard Transform transformed = hadamard_transform_2d(mean_removed_residual) mr_satd = np.sum(np.abs(transformed)) return mr_satd # 示例图像块(4x4) pred_block = np.array([[10, 12, 15, 17], [11, 13, 16, 18], [12, 14, 17, 19], [13, 15, 18, 20]]) ref_block = np.array([[9, 11, 14, 16], [10, 12, 15, 17], [11, 13, 16, 18], [12, 14, 17, 19]]) print("MR-SAD:", compute_mr_sad(pred_block, ref_block)) print("MR-SATD:", compute_mr_satd(pred_block, ref_block)) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值