视频与立体图像压缩技术详解
视频压缩基础代码分析
在视频压缩领域,有一段基础代码值得深入探究:
cblk = floor(c/N);
D = 1.0e+10;% initial city block distance
x1 = x{L+1}(rblk,cblk)/4; y1 = y{L+1}(rblk,cblk)/4;
for u = -6:6
for v = -6:6
Indr1 = round(r+u+y1+1);
Indr2 = Indr1 + 7;
Indc1 = round(c+v+x1+1);
Indc2 = Indc1 + 7;
d = B1{L}(r+1:r+N,c+1:c+N)-A1{L}(Indr1:Indr2,Indc1:Indc2);
d = sum(abs(d(:)));% city block distance between pixels
if d < D
D = d;
x{L}(rblk,cblk) = v; y{L}(rblk,cblk) = u;
end
end
end
end
end
% Reconstruct current frame using prediction error & reference frame
N = 8;
[Height,Width] = size(A{1});
N2 = 2*N;
pf = double(zeros(Height,Width)); % prediction frame
Br = double(zeros(Height,Width)); % reconstructed frame
for r = 1:N:Height
rblk = floor(r/N) + 1;
for c = 1:N:Width
cblk = floor(c/N) + 1;
x1 = x{1}(rblk,cblk); y1 = y{1}(rblk,cblk);
pf(r:r+N-1,c:c+N-1) = B1{1}(r+N:r+N2-1,c+N:c+N2-1)...
-A1{1}(r+N+y1:r+y1+N2-1,c+N+x1:c+x1+N2-1);
Br(r:r+N-1,c:c+N-1) = A1{1}(r+N+y1:r+y1+N2-1,
c+N+x1:c+x1+N2-1)...+ pf(r:r+N-1,c:c+N-1);
end
end
%
figure,imshow(uint8(round(Br))),title('Reconstructed image')
这段代码主要实现了视频帧的运动估计和重建。首先,通过双重循环遍历搜索窗口,计算当前块与参考块之间的城市街区距离(City Block Distance),找到最小距离对应的运动向量。然后,利用预测误差和参考帧来重建当前帧。具体步骤如下:
1.
初始化参数
:设置初始的城市街区距离
D
为一个极大值,计算块索引
cblk
等。
2.
运动估计
:在搜索窗口内遍历所有可能的偏移量
(u, v)
,计算当前块与参考块的差异
d
,更新最小距离
D
和对应的运动向量
(x{L}(rblk,cblk), y{L}(rblk,cblk))
。
3.
帧重建
:根据运动向量计算预测帧
pf
,并将其与参考块相加得到重建帧
Br
。
4.
显示结果
:使用
imshow
函数显示重建后的图像。
MC 预测编码
MC(Motion Compensation,运动补偿)预测编码是一种有效的视频压缩技术。其编码和解码过程可以通过以下流程图来表示:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px
A([输入像素块]):::startend --> B(运动估计):::process
B --> C(MC 预测):::process
C --> D( - ):::process
A --> D
D --> E(DCT):::process
E --> F(量化):::process
F --> G(编码器输出):::startend
G --> H(解码器输入):::startend
H --> I(反量化):::process
I --> J(IDCT):::process
J --> K( + ):::process
B --> L(运动向量):::process
L --> M(MC 预测):::process
M --> K
K --> N([重建像素块]):::startend
在编码器中,当前输入图像按光栅扫描顺序分割成矩形块,估计当前块与参考块之间的运动,得到运动向量。利用运动向量进行预测,得到预测块,将其从当前输入块中减去得到差分块。对差分块进行离散余弦变换(DCT)和量化。在解码器中,对量化后的 DCT 系数进行反量化和逆 DCT 变换,再加上 MC 预测块,重建图像。
不过,在实际应用中,有几点需要注意:
1.
运动估计的参考帧
:编码器中的运动估计可以使用帧缓冲区中未压缩的原始图像,但解码器无法获取未压缩图像,因此必须使用先前解码的图像作为参考帧。这会导致运动估计不准确,且随着时间推移误差会逐渐增大。为了缓解这种情况,需要定期使用关键帧,关键帧采用帧内编码技术独立压缩。
2.
DCT 的作用
:由于 MC 预测误差已经去相关,对误差块应用 2D DCT 在提高压缩率方面没有显著优势。
3.
熵编码
:量化后的 DCT 系数和运动向量都需要进行熵编码,以便传输或存储。在上述流程图中,省略了熵编码器和解码器。
示例分析:乒乓球视频序列
以乒乓球视频序列的第 41 - 49 帧为例,使用 MC 预测编码进行帧间编码。具体操作步骤如下:
1.
读取参考帧
:读取第 40 帧作为参考帧。
2.
逐帧处理
:依次读取第 41 - 49 帧,对每一帧中的 8×8 块在 16×16 的搜索窗口内进行全搜索,使用 SAD(Sum of Absolute Differences,绝对误差和)作为匹配度量,估计运动向量。
3.
计算差分块
:根据运动向量对齐当前块和参考块,计算差分块。
4.
DCT 变换和量化
:对差分块进行 2D DCT 变换,使用量化步长为 16 的均匀量化器进行量化和反量化。
5.
帧重建
:对反量化后的 DCT 系数进行逆 DCT 变换,将结果与参考块相加,重建像素。
6.
更新参考帧
:将重建后的帧作为下一帧的参考帧。
实验结果表明,与简单差分编码相比,MC 预测编码在 SNR(Signal-to-Noise Ratio,信噪比)上有 2 dB 的提升。虽然重建帧的外观差异不明显,但 MC 编码图像与简单差分编码图像的差异图显示了运动区域的斑块,其方差约为 31。
立体图像压缩
立体图像对由同一场景的左右视图组成,当呈现给人类视觉系统时,会产生深度感知。左右图像非常相似,差异主要源于场景相对于两只眼睛的坐标不同。立体图像压缩与视频序列中减少时间相关性类似,因此在此进行介绍。
以火星陆地的立体图像对为例,简单差分和 DC(Disparity Compensated,视差补偿)差分的结果如下:
| 差分方式 | 方差 |
| ---- | ---- |
| 简单差分 | 2331 |
| DC 差分 | 635 |
从方差数据可以看出,DC 差分的结果方差明显小于简单差分,说明 DC 差分能更有效地减少图像之间的相关性。通过块运动估计来估计左右图像块之间的视差,将右图像块与左图像块对齐后计算差分块,得到的 DC 差分图像细节更少。最后,对左图像采用 JPEG 压缩,根据量化后的左图像估计右 DC 差分图像,重建右图像。
综上所述,视频压缩和立体图像压缩都利用了图像之间的相关性,通过预测和变换等技术减少数据冗余,提高压缩效率。在实际应用中,需要根据具体情况选择合适的压缩方法和参数,以达到最佳的压缩效果。
视频与立体图像压缩技术详解
视频压缩技术的深入探讨
在视频压缩中,除了前面提到的 MC 预测编码,还有许多其他方面值得深入研究。
运动估计方法
运动估计是视频压缩中的关键步骤,常见的运动估计方法有多种,以下是一些主要方法的对比:
| 方法 | 特点 | 计算复杂度 | 精度 |
| ---- | ---- | ---- | ---- |
| 全搜索法 | 遍历搜索窗口内所有可能的位置,找到最优匹配 | 高 | 高 |
| 三步搜索法 | 分三步逐步缩小搜索范围,减少搜索点 | 中 | 中 |
| 金字塔搜索法 | 采用多分辨率图像进行搜索,先在低分辨率图像上粗搜索,再在高分辨率图像上精搜索 | 中 | 较高 |
全搜索法虽然能得到最精确的运动向量,但计算量巨大,不适合实时应用。三步搜索法和金字塔搜索法通过减少搜索点或采用多分辨率策略,在一定程度上降低了计算复杂度,同时保持了较好的精度。
量化策略
量化是视频压缩中减少数据量的重要步骤。不同的量化策略会对压缩效果产生显著影响。常见的量化策略有均匀量化和非均匀量化。
-
均匀量化
:使用固定的量化步长对 DCT 系数进行量化,如在乒乓球视频序列的示例中,使用了量化步长为 16 的均匀量化器。均匀量化简单易行,但可能会导致一些重要信息的丢失。
-
非均匀量化
:根据 DCT 系数的重要性分配不同的量化步长,对重要系数采用较小的量化步长,对不重要系数采用较大的量化步长。非均匀量化可以在保证图像质量的前提下,进一步提高压缩率。
熵编码
熵编码用于对量化后的 DCT 系数和运动向量进行编码,以减少数据的冗余度。常见的熵编码方法有哈夫曼编码和算术编码。
-
哈夫曼编码
:根据符号出现的概率分配不同长度的编码,出现概率高的符号使用较短的编码,出现概率低的符号使用较长的编码。哈夫曼编码简单高效,是一种常用的熵编码方法。
-
算术编码
:将整个消息表示为一个区间内的一个小数,通过不断细分区间来进行编码。算术编码可以达到理论上的最优编码效率,但实现复杂度较高。
立体图像压缩的扩展应用
立体图像压缩的思想可以扩展到立体视频压缩中。立体视频由多个立体图像对组成,除了利用立体图像对之间的相关性,还可以利用视频序列的时间相关性进行压缩。
立体视频压缩的流程如下:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px
A([输入立体视频帧]):::startend --> B(立体图像对处理):::process
B --> C(视差估计):::process
C --> D(DC 差分):::process
D --> E(视频帧处理):::process
E --> F(运动估计):::process
F --> G(MC 预测):::process
G --> H( - ):::process
E --> H
H --> I(DCT):::process
I --> J(量化):::process
J --> K(熵编码):::process
K --> L(编码器输出):::startend
L --> M(解码器输入):::startend
M --> N(熵解码):::process
N --> O(反量化):::process
O --> P(IDCT):::process
P --> Q( + ):::process
F --> R(运动向量):::process
R --> S(MC 预测):::process
S --> Q
C --> T(视差向量):::process
T --> U(DC 预测):::process
U --> Q
Q --> V([重建立体视频帧]):::startend
在立体视频压缩中,首先对每个立体图像对进行视差估计和 DC 差分,减少左右图像之间的相关性。然后对视频帧进行运动估计和 MC 预测,减少时间相关性。最后对差分块进行 DCT 变换、量化和熵编码。在解码器中,按照相反的顺序进行解码和重建。
总结与展望
通过对视频压缩和立体图像压缩技术的详细介绍,我们可以看到这些技术利用了图像和视频中的相关性,通过预测、变换和编码等手段减少数据冗余,提高压缩效率。
在实际应用中,需要根据具体的需求和场景选择合适的压缩方法和参数。例如,对于实时视频流,需要选择计算复杂度较低的运动估计方法和量化策略,以保证实时性;对于存储需求较高的视频,需要选择压缩率较高的方法,如非均匀量化和算术编码。
未来,随着视频和立体图像技术的不断发展,对压缩技术的要求也会越来越高。一方面,需要进一步提高压缩率,减少存储空间和传输带宽的需求;另一方面,需要保证压缩后的图像和视频质量,满足用户的视觉体验。同时,随着人工智能技术的发展,利用深度学习等方法进行视频和立体图像压缩也将成为一个研究热点。我们期待未来能有更加高效、智能的压缩技术出现,推动视频和立体图像领域的发展。
超级会员免费看
82

被折叠的 条评论
为什么被折叠?



