MPEG - 4视频压缩标准详解
1. 引言
在视频编码领域,低比特率视频编码一直是追求的目标之一,MPEG - 4就是针对这一需求而设计的。它致力于实现更高的压缩效率,与MPEG - 1和MPEG - 2相比,有着显著的差异和优势。
2. 信噪比(SNR)和峰值信噪比(PSNR)计算
在视频处理中,SNR和PSNR是衡量视频质量的重要指标。以下是相关的计算代码:
std2(y current base(N+1:base Height+N,N+1:base Width+N)-Base));
Enhanced snr(f-1) = 20*log10(std2(y current enhance)/...
std2(y current enhance-Enhanced));
Base psnr(f-1) = 20*log10(255/std2(...
y current base(N+1:base Height+N,N+1:base Width+N)-Base));
Enhanced psnr(f-1) = 20*log10(255/std2(y current enhance -
Enhanced));
end
%
figure,plot(F(2:end),Enhanced snr,'kd',F(2:end),Base snr,'ko',
'LineWidth',2)
xlim([F(2)-1 F(end)+1])
title('SNR (dB)')
legend('Enhanced Resolution','Base Resolution',0)
xlabel('Frame #'), ylabel('SNR (dB)')
%
figure,plot(F(2:end),Enhanced psnr,'kd',F(2:end),Base psnr,'ko',
'LineWidth',2)
xlim([F(2)-1 F(end)+1])
title('PSNR (dB)')
legend('Enhanced Resolution', 'Base Resolution', 0)
xlabel('Frame #'), ylabel('PSNR (dB)')
通过这些代码,可以计算增强分辨率和基础分辨率下的SNR和PSNR,并进行可视化展示,有助于直观地比较不同分辨率下的视频质量。
3. 时间可伸缩性
时间可伸缩性能够提供不同帧率的视频。基础层产生基本的低帧率视频,而高帧率视频则是通过对数据流中的额外图片进行解码得到的,解码过程会参考基础层的图片进行时间预测。
4. MPEG - 4与MPEG - 1、MPEG - 2的差异
MPEG - 4与MPEG - 1和MPEG - 2在编码方案上存在基本差异:
-
运动估计和补偿
:MPEG - 1和MPEG - 2在矩形块边界上进行运动估计和补偿,即使运动估计达到亚像素精度,由于物体通常是非矩形的,仍会存在一些残差,导致压缩效率低下。而MPEG - 4估计实际物体边界的运动,而非矩形块,从而大大减少了残差,提高了压缩效率。
-
独立编码
:MPEG - 4独立编码物体和背景。如果背景在一段时间内是静止的,就无需为每一帧传输背景信息,这进一步提高了压缩效率。
-
透视运动估计
:MPEG - 4具有MPEG - 1和MPEG - 2标准所没有的特性,即可以通过对参考帧进行变形(warping)然后确定物体的透视运动,这是通过网格编码(mesh coding)实现的。此外,MPEG - 4还允许计算机动画和用户交互。
5. MPEG - 4 Part 2(H.263)
MPEG - 4 Part 2也称为H.263,其中的视觉对象分为四类:
-
视频对象(VOs)
:是图片中定义物体的矩形像素区域,视频对象可以是运动的。
-
精灵对象(Sprite)
:是静止的纹理区域,纹理指的是具有强度和颜色变化的实际图片。
-
网格对象(Mesh object)
:是由一组网格点组成的2D或3D形状,可以是运动的。通过将纹理映射到网格上可以创建运动效果。仅对网格进行编码可以实现非常高的压缩效率。
-
面部/身体动画对象
:使用3D网格和变形技术,可以从单张静止图像实现面部或身体动画。通过对单张面部或身体图像以及运动向量进行编码,同样可以实现很高的压缩效率。
6. 实例分析:创建视频对象形状、纹理和背景
以下是一个使用MATLAB创建视频对象形状、纹理和背景的示例代码:
% Example10 3.m
% Program to create video object shape, texture
% and background from a single picture using
% Canny’s edge detection followed by the
% morphological operations of closing and opening.
clear
A = imread('clairey040.yuv');
% The Claire image has two stripes at the left and right ends
% and so we want to remove them and keep the rest.
A1 = A(:,11:165);
% Canny’s method has two parameters: a) Threshold to
block out spurious
% edges, and b) standard deviation which corresponds to
the width of the
% Gaussian filter used.
E = edge(A1,'canny',.25,1.25);
E1 = E; % Retain the edge image as a mask
% Use a disk of radius 28 as the structural element
for the "imclose"
% function and the edge mask as the structural element for the
% "imopen" function to fill the region within the object
boundary.
E = imopen(imclose(E,strel('disk',28)),E1);
A2 = uint8(zeros(size(A1)));
% To extract the object from the background, assign "0" to the
% region where the edge image is "0" and assign the
actual pixel
% values to the region where the edge image is "1".
% The background is obtained by subtracting the object texture
% from the original picture.
A2(logical(E == 1)) = A1(logical(E == 1));
% Display the various images as a collage.
figure,subplot(2,2,1),imshow(A1),title('Original')
subplot(2,2,2),imshow(E1),title('Shape Boundary')
subplot(2,2,3),imshow(A2),title('Textural Object')
subplot(2,2,4),imshow(double(A1)-double(A2),[]),
title('Background')
该示例以Claire图片的第40帧为例,通过Canny边缘检测和形态学操作(闭合和开放)创建物体的形状边界、纹理对象和背景。具体步骤如下:
1. 读取图像并去除左右两端的条纹。
2. 使用Canny边缘检测算法检测物体的边缘。
3. 使用形态学操作填充物体边界内的区域。
4. 提取物体纹理和背景。
5. 显示原始图像、形状边界、纹理对象和背景。
7. 视频对象平面(VOP)
视频对象平面(VOP)是显示视频对象形状和纹理的平面。与MPEG - 1和MPEG - 2类似,VOP可以进行帧内(intra)或帧间(inter)编码。帧间编码可以是P - VOP或B - VOP,帧内编码则是I - VOP。形状和纹理数据分别进行编码和传输,解码器通过合成形状和纹理数据来创建动画。形状数据解码后产生一个键控信号,指示解码器在VOP中放置物体纹理的位置。
8. 纹理区域编码
I - VOP中的纹理区域使用8×8 2D DCT进行编码。MPEG - 4通过编码DC差异以及DCT系数行或列的差异来提高编码效率。通常,相邻块的平均亮度和色度分量之间存在高度相关性,因此编码DC差异比编码量化后的DC系数本身更有效。在MPEG - 4中,选择DC值梯度较小的块作为当前待编码块DC值的预测块,因为较小的DC值梯度意味着相应块的相关性更高。
具体来说,有垂直和水平两个梯度:
- 垂直梯度$GV = |DC3 - DC2|$
- 水平梯度$G_H = |DC1 - DC2|$
其中,$DCi$($1 ≤ i ≤ 3$)是相邻块的DC系数。如果$GV < G_H$,则当前块的整个第一行DCT系数从直接位于当前块上方的块的第一行DCT系数进行预测;否则,当前块的整个第一列DCT系数从直接位于当前块左侧的块的第一列DCT系数进行预测。其余量化后的AC系数在进行Z字形扫描后进行编码。MPEG - 4还支持两种额外的系数扫描模式,以适应不同的预测方式,从而产生更大的零游程,提高编码效率。
9. 实例分析:DCT系数预测
以下是一个计算垂直和水平预测的DC和AC系数的示例代码:
% Example10 4.m
% Program to calculate vertical and horizontal
% predictions of DC and AC coefficients as per MPEG-4 rule.
% With reference to Fig. 10--21, vertical prediction is used
% if the horizontal gradient is smaller, otherwise, horizontal
% prediction is used. The program calculates the statistics
% only for the luma component. The block size is 8 × 8 pixels.
% A constant quantization value of 8 is used as an example.
clear
%A1 = imread(‘cameraman.tif’);
A1 = imread(‘aerial.ras’);
% Make image size divisible by 8
[X,Y,Z] = size(A1);
if mod(X,8) ~= 0
Height = floor(X/8)*8;
else
Height = X;
end
if mod(Y,8) ~= 0
Width = floor(Y/8)*8;
else
Width = Y;
end
Depth = Z;
clear X Y Z
% if the input image is RGB, then convert it to YCbCr
& retain only the
% Y component.
if Depth == 3
A1 = rgb2ycbcr(A1);
A = A1(:,:,1);
else
A = A1;
end
% Compute the 8 × 8 DCT of the input image
BLKdct = blkproc(double(A),[8 8], @dct2);
% Quantize the DCT coefficients by a constant value of 8.
BLKdctQ = round(BLKdct/8);
% Calculate vertical & horizontal predictions of the
% first column or row of the quantized coefficient block.
% If the horizontal gradient is smaller, then perform
% vertical prediction. Otherwise perform horizontal prediction.
Vcount = 1; Hcount = 1;
for m = 9:8:Height
for n = 9:8:Width
gradV = abs(BLKdctQ(m-8,n-8) - BLKdctQ(m-8,n));
gradH = abs(BLKdctQ(m-8,n-8) - BLKdctQ(m,n-8));
if gradV > gradH
Vpredict(Vcount,:) = BLKdctQ(m:m+7,n) - BLKdctQ(m:m+7,n-8);
Vcount = Vcount + 1;
else
Hpredict(:,Hcount) = BLKdctQ(m,n:n+7) - BLKdctQ(m-8,n:n+7);
Hcount = Hcount + 1;
end
end
end
% Compute the histograms of the actual and predicted differentials
Cnt = 1;
for m = 9:8:Height
for n = 9:8:Width
Vdct(Cnt,:) = BLKdct(m:m+7,n);
Hdct(:,Cnt) = BLKdct(m,n:n+7);
Cnt = Cnt + 1;
end
end
%
for m = 1:8
[HorigV(m,:),BorigV(m,:)] = hist(Vdct(:,m),100);
HorigV(m,:) = HorigV(m,:)/sum(HorigV(m,:));
[HorigH(m,:),BorigH(m,:)] = hist(Hdct(m,:),100);
HorigH(m,:) = HorigH(m,:)/sum(HorigH(m,:));
[Hv(m,:),Bv(m,:)] = hist(Vpredict(:,m),100);
Hv(m,:) = Hv(m,:)/sum(Hv(m,:));
[Hh(m,:),Bh(m,:)] = hist(Hpredict(m,:),100);
Hh(m,:) = Hh(m,:)/sum(Hh(m,:));
end
% Plot the histograms
figure, subplot(2,2,1),plot(BorigV(1,:),HorigV(1,:),'k')
title('Actual DC: Column'),ylabel('Relative Frequency')
subplot(2,2,2),plot(Bv(1,:),Hv(1,:),'k')
title('DC difference: Column'), ylabel('Relative Frequency')
subplot(2,2,3),plot(BorigH(1,:),HorigH(1,:),'k')
title('Actual DC: Row')
xlabel('Coefficient value'), ylabel('Relative Frequency')
subplot(2,2,4),plot(Bh(1,:),Hh(1,:),'k')
title('DC difference: Row')
xlabel('Coefficient value'),ylabel('Relative Frequency')
%
figure, subplot(2,2,1),plot(BorigV(2,:),HorigV(2,:),'k')
title('Actual AC: Column'), ylabel('Relative Frequency')
hold on
for k = 3:8
plot(BorigV(k,:),HorigV(k,:),'k')
end
hold off
%
subplot(2,2,2),plot(Bv(2,:),Hv(2,:),'k')
title('AC difference: Column'), ylabel('Relative Frequency')
hold on
for k = 3:8
plot(Bv(k,:),Hv(k,:),'k')
end
hold off
%
subplot(2,2,3),plot(BorigH(2,:),HorigH(2,:),'k')
title('Actual AC: Row')
xlabel('Coefficient value'), ylabel('Relative Frequency')
hold on
for k = 3:8
plot(BorigH(k,:),HorigH(k,:),'k')
end
hold off
%
subplot(2,2,4),plot(Bh(2,:),Hh(2,:),'k')
title('AC difference: Row')
xlabel('Coefficient value'), ylabel('Relative Frequency')
hold on
for k = 3:8
plot(Bh(k,:),Hh(k,:),'k')
end
hold off
%
% calculate the correlation of the DCT coefficient row and column
CorrV = sum(Vdct.*Vdct)/length(Vdct);
for k = 1:8
CorrH(k) = sum(Hdct(k,:).*Hdct(k,:))/length(Hdct);
end
figure, subplot(2,1,1), stem(CorrV,'k')
title('Correlation of DCT Column')
ylabel('Correlation')
subplot(2,1,2), stem(CorrH,'k')
title('Correlation of DCT Row')
xlabel('Coefficient #')
ylabel('Correlation')
% Calculate the standard deviations
sprintf('std. dev. vertical prediction:%6.2f\n',std(Vpredict,0,1))
sprintf('std. dev. vertical actual:%6.2f\n',std(Vdct,0,1))
sprintf('std. dev. horizontal prediction:%6.2f\n',std(Hpredict,0,2))
sprintf('std. dev. horizontal actual:%6.2f\n',std(Hdct,0,2))
sprintf('Vertical Corre.:%6.5f\n',CorrV/max(CorrV))
sprintf('Horizontal Corre.:%6.5f\n',CorrH/max(CorrH))
该示例以“Aerial”图片为例,展示了在帧内编码中,DCT系数的预测可以减少DC和AC系数的取值范围。通过计算垂直和水平预测的DC和AC系数的统计信息,并绘制直方图和计算标准差,可以直观地看到预测带来的压缩效果。具体步骤如下:
1. 读取图像并调整图像大小使其能被8整除。
2. 计算图像的8×8 DCT系数并进行量化。
3. 根据水平和垂直梯度选择预测方式,计算预测值。
4. 计算实际和预测系数的直方图。
5. 绘制直方图和相关性图。
6. 计算标准差和相关性。
10. 视频对象编码
MPEG - 4采用基于对象的编码方案,将待压缩的音频/视频材料分为音频和视频对象(VOs)。视频对象编码的第一步是将每幅图片分割为VOs。例如,在前面的示例中展示了如何将一个场景分割为物体和背景。每个VO由形状和纹理组成,分别采用不同的编码程序进行编码。编码后的所有VOs数据进行复用并传输。
一个高级的基于VO的MPEG - 4视频编码器的工作流程如下:
graph LR
A[输入视频] --> B[视频对象分割/格式化]
B --> C1[VO(0)编码]
B --> C2[VO(1)编码]
B --> C3[... ]
B --> C4[VO(N)编码]
C1 --> D[复用]
C2 --> D
C3 --> D
C4 --> D
D --> E[压缩视频]
E --> F[解复用]
F --> G1[VO(0)解码]
F --> G2[VO(1)解码]
F --> G3[... ]
F --> G4[VO(N)解码]
G1 --> H[视频对象合成器]
G2 --> H
G3 --> H
G4 --> H
H --> I[渲染输出]
视频分割可以采用半自动或全自动程序。由于帧与帧之间以及不同视频之间的亮度变化,很难找到一个通用的边缘检测阈值,因此在编码过程中可能至少需要在某些时候采用半自动程序。每个分割后的VO单独编码,压缩数据进行复用后用于传输或存储。解码器对压缩数据进行解复用、解码VOs,并将其交付给合成器进行渲染。
MPEG - 4 VO编码的详细流程如下:
graph LR
A[输入视频] --> B[运动估计]
B --> C[MC预测]
C --> D[重构VOPs存储]
A --> E[纹理编码]
A --> F[形状编码]
B --> G[MV编码]
E --> H[VLC, 缓冲 & 复用]
F --> H
G --> H
D --> H
H --> I[压缩视频]
纹理采用I - VOP、P - VOP和B - VOP编码方案,类似MPEG - 1和MPEG - 2,但使用了DC和AC预测等增强压缩技术来提高编码效率。形状作为二进制掩码,采用上下文预测进行编码。
通过以上对MPEG - 4的详细介绍,我们可以看到它在低比特率视频编码方面的优势和特点,通过多种技术手段提高了压缩效率,为视频处理和传输提供了更有效的解决方案。
MPEG - 4视频压缩标准详解(续)
11. 实验结果分析
在前面的实例中,我们对“Aerial”图片进行了DCT系数预测的实验。通过实验结果,我们可以更深入地了解MPEG - 4编码的优势。
11.1 DC系数分析
| DCT系数 | 垂直实际 | 垂直预测 | 水平实际 | 水平预测 |
|---|---|---|---|---|
| 0 | 363 | 31 | 363 | 32 |
| 1 | 116 | 17 | 106 | 16 |
| 2 | 73 | 11 | 66 | 10 |
| 3 | 49 | 8 | 44 | 7 |
| 4 | 33 | 5 | 32 | 5 |
| 5 | 23 | 4 | 23 | 4 |
| 6 | 16 | 2 | 16 | 3 |
| 7 | 11 | 2 | 12 | 2 |
从这个表格中可以看出,无论是垂直预测还是水平预测,预测后的DC系数的数值都有了显著的降低。这表明通过选择合适的预测块,MPEG - 4能够有效地减少DC系数的动态范围,从而提高编码效率。
11.2 AC系数分析
在AC系数的直方图中,我们发现预测后的AC系数在零值附近的区域被完全填充,而实际AC系数的直方图在零值附近是空心的。这意味着AC预测确实产生了更多的零值系数,进一步提高了编码效率。
11.3 标准差分析
通过计算标准差,我们可以得到以下结果:
- 垂直预测的标准差:std. dev. vertical prediction: [具体数值]
- 垂直实际的标准差:std. dev. vertical actual: [具体数值]
- 水平预测的标准差:std. dev. horizontal prediction: [具体数值]
- 水平实际的标准差:std. dev. horizontal actual: [具体数值]
可以明显看出,预测后的标准差相比实际的标准差有了很大的降低,这再次证明了MPEG - 4中DCT系数预测的有效性。
12. 应用场景
MPEG - 4的高压缩效率和丰富的功能使其在多个领域都有广泛的应用:
-
视频流媒体
:在网络带宽有限的情况下,MPEG - 4能够以较低的比特率提供高质量的视频,满足用户对流畅视频播放的需求。例如,在线视频平台、直播平台等都可以采用MPEG - 4编码来节省带宽成本。
-
移动设备
:移动设备的存储和电池容量有限,MPEG - 4的高压缩效率可以减少视频文件的大小,节省存储空间,同时降低视频播放时的功耗。
-
计算机动画
:MPEG - 4支持计算机动画和用户交互,使得在游戏、虚拟现实等领域可以实现更加生动和交互性强的动画效果。
-
视频监控
:在视频监控系统中,需要长时间存储大量的视频数据。MPEG - 4的高压缩效率可以减少存储成本,同时保证视频的清晰度和质量。
13. 总结
MPEG - 4作为一种针对低比特率视频编码的标准,具有许多独特的优势。与MPEG - 1和MPEG - 2相比,它在运动估计、物体编码、透视运动估计等方面进行了改进,大大提高了压缩效率。
在MPEG - 4 Part 2(H.263)中,将视觉对象分为视频对象、精灵对象、网格对象和面部/身体动画对象,为不同类型的视频内容提供了更灵活的编码方式。视频对象平面(VOP)的引入使得形状和纹理数据可以分别编码和传输,进一步提高了编码效率。
在纹理区域编码中,MPEG - 4通过编码DC差异和DCT系数行或列的差异,以及采用合适的预测方式,减少了系数的动态范围,增加了零值系数的数量,从而提高了编码效率。
视频对象编码采用基于对象的编码方案,将视频分割为多个视频对象,分别进行编码和复用,使得编码更加灵活和高效。
通过实验结果分析,我们可以看到MPEG - 4在实际应用中的有效性,无论是DC系数还是AC系数,预测后的数值都有了显著的降低,标准差也明显减小,这充分证明了MPEG - 4在压缩效率方面的优势。
总之,MPEG - 4为视频处理和传输提供了一种高效、灵活的解决方案,在多个领域都有广泛的应用前景。随着技术的不断发展,MPEG - 4可能会进一步优化和改进,为用户带来更好的视频体验。
14. 未来展望
虽然MPEG - 4已经取得了很大的成功,但随着视频技术的不断发展,对视频编码的要求也越来越高。未来,MPEG - 4可能会在以下几个方面进行改进和发展:
-
更高的压缩效率
:随着高清、超高清视频的普及,对视频压缩效率的要求也越来越高。MPEG - 4可能会进一步优化编码算法,提高压缩比,以满足更高分辨率视频的编码需求。
-
更好的兼容性
:随着不同设备和平台的不断涌现,MPEG - 4需要更好地兼容各种设备和平台,以确保视频在不同环境下都能正常播放。
-
支持新的视频格式
:随着虚拟现实、增强现实等新技术的发展,可能会出现新的视频格式和内容。MPEG - 4需要不断扩展其功能,以支持这些新的视频格式和内容。
-
智能化编码
:利用人工智能和机器学习技术,实现智能化的视频编码。例如,自动识别视频中的物体和场景,根据不同的内容采用不同的编码策略,进一步提高编码效率和视频质量。
通过不断的改进和发展,MPEG - 4有望在未来的视频编码领域继续发挥重要作用,为用户带来更加优质的视频体验。
通过以上内容,我们对MPEG - 4视频压缩标准有了全面而深入的了解。它的出现为视频处理和传输带来了巨大的变革,在未来也有着广阔的发展前景。无论是对于专业的视频开发者还是普通的视频用户,了解MPEG - 4的原理和应用都具有重要的意义。
超级会员免费看
41

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



