H.265帧内预测的Planar模式
Planar (平面) 模式适合处理像素值平滑渐变的区域(如天空、墙壁的阴影等),能有效避免块效应。
核心思想
假设当前块内的像素值构成一个平滑的、倾斜的平面。这个“平面”是由块的边界像素(上方、左方、右上方、左下方)决定的。块内任意一点 (x, y) 的像素值,都可以通过这个假想的平面计算出来。
这本质上是一个双线性插值 (Bilinear Interpolation) 的过程。
插值所需的参考像素
要预测一个 N×N 的块,Planar 模式需要用到其左边和上边已重建的参考像素,以及两个角落的像素。
ASCII 图示:
p[-1][-1] p[0][-1] p[1][-1] ... p[N-1][-1] p[N][-1] ... p[2N-1][-1]
p[-1][0]   +----------------+
p[-1][1]   |                |
...        |   当前预测块     |
p[-1][N-1] |      (N x N)   |
p[-1][N]   |                |
...        +----------------+
p[-1][2N-1]
- p[x][-1]:块上方的参考像素行 (- xfrom 0 to N-1)。
- p[-1][y]:块左侧的参考像素列 (- yfrom 0 to N-1)。
- p[-1][-1]:左上角的参考像素。
- p[N-1][-1]:右上角的参考像素(实际使用的)。
- p[-1][N-1]:左下角的参考像素(实际使用的)。
插值具体步骤
对于块内任意一点 pred(x, y)(其中 x 和 y 是从 0 到 N-1 的坐标),其值的计算可以分解为两步:水平插值和垂直插值,最后将两者平均。
水平方向的线性预测
首先,我们沿着水平方向进行插值。对于块中的任意一行 y,我们可以想象有一条从左侧参考像素 p[-1][y] 到 块右边界 的连线。这个右边界的值是通过线性外插得到的,其参考点是右上角的像素 p[N-1][-1]。
具体来说,对于点 (x, y),它的水平预测值 pred_H(x, y) 是 p[-1][y] 和 p[N-1][-1] 的加权平均:
pred_H(x, y) = (N - 1 - x) * p[-1][y] + (x + 1) * p[N-1][-1]
这个公式可以理解为:点 (x, y) 距离左边界越近(x 越小),就越接近 p[-1][y] 的值;距离右边界越近(x 越大),就越接近 p[N-1][-1] 的值。
垂直方向的线性预测
同理,我们沿着垂直方向进行插值。对于块中的任意一列 x,我们可以想象有一条从上方参考像素 p[x][-1] 到 块下边界 的连线。这个下边界的值是通过左下角的像素 p[-1][N-1] 外插得到的。
对于点 (x, y),它的垂直预测值 pred_V(x, y) 是 p[x][-1] 和 p[-1][N-1] 的加权平均:
pred_V(x, y) = (N - 1 - y) * p[x][-1] + (y + 1) * p[-1][N-1]
步骤三:合并预测值
最终的预测值 pred(x, y) 是水平预测和垂直预测的平均值。为了进行整数运算并包含舍入(rounding),公式如下:
pred(x, y) = (pred_H(x, y) + pred_V(x, y) + N) >> (log2N + 1)
这里的 N 是块的边长,log2N 是 N 的以 2 为底的对数。>> (log2N + 1) 等价于除以 2*N。