运动矢量如何在MPEG的预测编码中起作用?


16

在MPEG中,存在将图像分解成宏块并且针对那些宏块中的每个宏块计算运动矢量的处理。然后,您将这些矢量以及预测误差一起传输,以重建视频序列中的下一个图像。

我正在设法牢牢掌握其工作原理。每个宏块都有一个与之关联的运动矢量(如果矢量为[1,0]),则表示all the pixels in this block move 1 in the x direction and 0 in the y direction for the next frame. 如果所有运动矢量未正确对齐,这是否会使图像的区域不被考虑(例如首先是那个宏块)?

例如,我发现以下问题。

在时间t考虑以下图像:

7   7   7   7           
7   7   5   5        
7   5   5   8         
8   8   8   8           
9   9   9   9       
9   9   9   9

将该图像分解为2x2宏块,并发送了以下运动矢量来重新创建它:

(0,0)  (0,0)  (0,1)  (-1,1)  (0,0)  (0,0)

上一个时间步t-1的图像如下所示:

7   7   7   7           
7   7   5   4        
7   7   7   7         
7   5   8   8           
8   9   8   9       
9   9   9   9   

传输的错误是什么?

您将如何解决?

Answers:


5

为了简化您的困惑-有两个过程:

1.运动估计
2.运动补偿

在谈论估计之前,我们应该谈论运动补偿。

让就是说,是在分裂块ö Ç ķ 小号 [ ķ ] X 'ý 'Imaget(x,y)Blockst[k](x,y)

运动补偿的任务是产生从任一区域的 中号ë - 1X ÿ Blockst[k](x,y)Imaget1(x,y)

因此,另一个不一定在16x16边界对齐的块是最佳匹配Blockst1[k](x+mx,y+my)

在此,称为运动向量。mx,my

我们可以计算目标和参考之间的误差为

Errt[k](x,y)=Blockst[k](x,y)Blockst1[k](x+mx,y+my)

因此,现在,编码器基本上 为每个块发送(具有DCT和量化)和m x m y [ k ]Errt[k](x,y)(mx,my)[k]

因此,编码器有2个工作要做:

1.运动估计
的方法,或估计ķ使得Ë - [R [R [ ķ ] X ÿ 被最小化被称为运动估计。mx,my[k]kErrt[k](x,y)

2.运动补偿后生成误差图像I t图像像素和m x m y [ k ]
构造过程称为运动补偿。 。错误图像将被传输。Blockst[k](x,y)It(mx,my)[k]

最终,解码器可以使用运动矢量和误差图像自行重新进行运动补偿,以最终重建图像。

现在我们意识到几点:

  1. 最佳运动估计有助于最大程度地减少需要传输的能量,从而针对给定质量优化位。

  2. 但是,即使不理想,或者场景比最后一张图片有显着变化,E r r t [ k ] x y 也总是发送给接收器-因此,重建总是完美的(对由量化产生的损失取模)。因此,即使您具有次优的运动矢量或多余的冗余也不多,但重构仍然是完美的,尽管有更多的位!(mx,my)[k]Errt[k](x,y)

  3. 每个块本身都是运动补偿的-因此,即使任何相邻块的实际运动矢量在构造中都没有影响。因此,没有必要使运动矢量完全对准以使可能的完美重建成为可能。Blockst[k](x,y)

  4. Blockst[k](mx,my)[k]Blockst[k+1]

  5. Energy(Errt[k](x,y))>Energy(Blockst[k](x,y))

在这种情况下,可能更可取的是直接发送没有预测的块,而不是发送差异。在编码器中,也可以通过称为INTRA块的设置来实现这一点。


3

不,它不会留下漏洞,因为矢量是从未知帧(P或B)到已知帧(I帧)的。它使人想起了如何计算图像变换-您可以使用向后变换来避免出现孔洞/


3

与许多标准信号处理例程一样,它在纸上非常简单,而且在实践中有些棘手。您将图像分为六个块一世Ĵ一世={01个2}Ĵ={01个}。每个块的坐标为2一世2Ĵ(我们考虑每个左上角的位置)。因此,我们现在有六个街区

(0,0)(0,2)
(2,0)(2,2)
(4,0)(4,2)

计算出的运动矢量 中号一世Ĵ 每个块都是

(0,0)(0,0)
(0,1)(-1,1)
(0,0)(0,0)

现在,要计算结果图像,我们必须首先知道每个块的移动位置。为此,我们只需将上面的坐标矩阵添加到其运动矩阵中:一世Ĵ=一世Ĵ+中号一世Ĵ。我们得到

(0,0)(0,2)
(2,1)(1,3)
(4,0)(4,2)

为了避免出现“漏洞”如你所说,我们不只是移动原始帧的块左右,以获得新的,我们把原来的一个作为参考,并注入新计算出的块。为此,我们首先复制原始框架。然后我们把每一个一世Ĵ 并用相应的像素替换 一世Ĵ

Note: We are not protected from any kind of overlapping of block "in motion" (two blocks are moved to overlapping locations). There are ways to handle that, but it's beyond the scope of this response. For now, we're just going to rewrite any pixels with a block we're moving to their location, so that even if there were blocks moved there previously, they will get overwritten.

Now, going block by block in the order you had in your question, we replace every B(i,j) by its corresponding B(i,j). We get the followinf estimated frame Fe

7   7   7   7
7   7   5   7
7   7   7   8
7   5   5   8
8   9   8   9
9   9   9   9

The error E is found between estimated frame Fe and the one we're trying to predict F is found by E=FFe which we calculate to be

0   0   0   0           
0   0   0  -3        
0   0   0  -1         
0   0   3   0           
0   0   0   0       
0   0   0   0

While i think Signal processing community by far is a best place to put this question, however, subjects like this and deeply involved technologies around this needs a space of its own. There is a new proposal of Q&A site Broadcast and Media Technologies Please join and contribute.
Dipan Mehta

@DipanMehta Very cool! = )
Phonon
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.