在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   


传递了哪些错误?

您将如何解决?这个吗?

#1 楼

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

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

在讨论估计值之前,我们应该先谈一下运动补偿。

比方说,$ Image_ {t}(x,y)$被分成块$ Blocks_ {t} [k](x',y')$。

运动补偿的任务是从
$ Image_ {t-1}(x,的任何区域生成$ Blocks_ {t} [k](x',y')$ y)$。

因此,另一个不一定与16x16边界对齐的块是最佳匹配$ Blocks_ {t-1} [k](x'+ mx,y'+ my)$

这里,$ mx,我的$被称为运动向量。

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

$$ Err_ {t} [k] (x,y)= Blocks_ {t} [k](x',y')-Blocks_ {t-1} [k](x'+ mx,y'+ my)$$

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

编码器有2个工作要做:

1。运动估计
以最小化$ Err_ {t} [k](x,y)$的方式对每个$ k $估计$ {mx,my} [k] $的过程称为运动估计。

2。运动补偿后生成错误图像
从$ I_ {t} $图像像素和$ {(mx,my)}构造$ Blocks_ {t} [k](x',y')$的过程[ k] $称为运动补偿。
错误图像将被传输。

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

现在我们实现了几点:最佳运动估计有助于最大程度地减少需要传输的能量,从而针对给定的质量优化比特。
但是,即使$ {((mx,my)} [k] $]不理想,或者场景比上一张图片有明显变化,$ Err_ {t} [k](x,y)$也会始终发送到接收器-因此,重构始终是完美的(对量化所产生的损耗进行模运算)。因此,即使您具有次优的运动矢量或多余的冗余也不多,但重构仍然总是完美的,尽管有更多的位!
每个块$ Blocks_ {t} [k](x',y')$本身都是运动补偿的-因此,即使任何相邻块的实际运动矢量在构造中均不起作用。因此,不必将运动矢量完美对齐即可实现完美的重建。
尽管存在算法,但他们足够聪明地猜测$ Blocks_ {t} [k] $是否具有运动矢量$(mx, my)[k] $对$ Blocks_ {t} [k + 1] $的猜测可能与之接近。
最后,假设下一张图片完全不同,则$$能量(Err_ {t} [k](x,y))>能量(Blocks_ {t} [k](x',y '))$$。

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

#2 楼

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

#3 楼

与许多标准信号处理例程一样,它在纸上非常简单,而且在实践中有些棘手。您将图像分成六个块$ B(i,j)$,其中$ i = \ {0,1,2 \} $和$ j = \ {0,1 \} $。每个块的坐标为$(2i,2j)$(我们考虑每个块的左上角以标识其位置)。因此,我们现在在

(0,0) (0,2)
(2,0) (2,2)
(4,0) (4,2)
有六个块,您为每个块计算的运动矢量$ M(i,j)$是

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

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


为了避免您所说的“空洞”,我们不会简单地移动原始框架的块来获得新的原始的作为参考,并注入新计算的块。为此,我们首先复制原始框架。然后,我们取每个$ B'(i,j)$并替换为对应的$ B(i,j)$的像素。 “运动中”(将两个块移动到重叠的位置)。有多种方法可以解决此问题,但这超出了此响应的范围。现在,我们将使用要移动到其位置的块重写所有像素,这样即使以前有块移动到那里,它们也会被覆盖。

现在,进行按照您在问题中的排列顺序,我们将每个$ B'(i,j)$替换为其对应的$ B(i,j)$。我们得到了跟踪估计框架$ F_e $

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


在估计框架$ F_e $和我们试图预测$ F的框架之间发现了错误$ E $。 $由$ E = F-F_e $找到,我们将其计算为

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


评论


$ \ begingroup $
虽然我认为到目前为止,信号处理社区是提出这个问题的最佳场所,但是,像这样的主题以及与此紧密相关的技术都需要有自己的空间。问与答站点广播和媒体技术有一个新建议。请加入并做出贡献。
$ \ endgroup $
– Dipan Mehta
2012年1月17日下午4:13

$ \ begingroup $
@DipanMehta太酷了! =)
$ \ endgroup $
– Phonon
2012年1月17日14:26