返回AV1专栏目录
Paeth Intra Prediction是AV1引入的一种新的预测模式,这个Paeth是一个人的名字(初次看到的时候我傻傻地去查词典),他是一位计算机科学家,名为Alan W. Paeth,此人在开发PNG时候提出了Paeth 预测技术
Paeth 帧内预测
在AV1的标准文档中,并没有出现Paeth prediction 这个词,取而代之的是basic intra prediction,详情见 7.11.2.2,这两个术语其实是指的同一个东西。
在AV1中,其Paeth Prediction mode的序号等于 12
intra_frame_y_mode | Name of intra_frame_y_mode |
---|---|
12 | PAETH_PRED |
在Paeth帧内预测中,需要比较三个像素值,分别是与当前块纵坐标相同的左边pixel,与当前块横坐标相同的上方pixel,以及左上角的pixel。对这三个pixel进行某种计算,哪个pixel的梯度(gradient)最低,就复制那个pixel的值作为当前pixel的预测值。
如下图所示:
Paeth Prediction 计算方式
paeth prediction的宗旨就是判断当前pixel的参考像素中存在的边界(edge)。从计算层面来说,就是比较从上方和左边(abs(A-C), abs(L-C), abs (A L-2C)
)寻找edge,把非edge方的值视为当前pixel的预测值。
例如
我们经过计算可用得知abs(L-C)的值比abs(A-C)大,则判断上方是存在边界的,所以把左边的值180作为p(1,1)
的预测值更好。
下一个例子:
在这个例子中,我们经过计算可用得知abs(L-C)的值比abs(A-C)小,则判断左边是存在边界的,所以把上方的值180作为p(1,1)
的预测值更好。
具体在源码中的实现示意如下
代码语言:javascript复制base = AboveRow[j] LeftCol[i] – AboveRow[-1]
pLeft = Abs(base – LeftCol[i]) // abs(A-C)
pTop = Abs(base – AboveRow[j]) // abs(L-C)
pTopLeft = Abs(base – AboveRow[-1]) // abs(A L-2*C)
if (pLeft <= pTop && pLeft <= pTopLeft)
pred[i][j] = LeftCol[i] // 使用左边参考像素值
else if(pTop <= pTopLeft)
pred[i][j] = AboveRow[j] // 使用上方参考像素值
else
pred[i][j] = AboveRow[-1] // 若上方与左边均判断为不存在边界的情况,则使用左上方的值