### 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-SATD 是 SATD(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))
```
---