MPEG-1压缩 - 产生宏块

时间:2009-12-05 11:48:38

标签: matlab matrix compression cell-array mpeg

我遇到了MPEG-1压缩的基本问题。我必须在图像中生成宏块。宏块由16 x 16像素组成 - 其中4 x 8x8是亮度,1 x 8x8是Cb和1 x 8x8 Cr。在MATLAB中,我想生成一个包含它的单元矩阵。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

听起来您正在尝试找出将各种 8 x 8 矩阵收集到单个变量中的最佳方法。有几种方法可以做到这一点(第一个选项是我为你的情况选择的选项):

  • 将数据连接成3-D矩阵:

    您可以使用CAT函数在给定维度上堆叠相同大小的矩阵。例如,如果变量L1L2L3L4中有4个 8 x 8 亮度矩阵,以下内容将它们连接成 8×8×4 矩阵:

    luminance = cat(3,L1,L2,L3,L4);
    

    您还可以添加其他CbCr矩阵来创建 8 x 8 x 6 矩阵:

    macroBlock = cat(3,L1,L2,L3,L4,Cb,Cr);
    %# OR...
    macroBlock = cat(3,luminance,Cb,Cr);  %# Using luminance variable from above
    

    然后,您可以通过以下方式对macroBlock进行索引,以访问所需的 8 x 8 矩阵:

    L2 = macroBlock(:,:,2);  %# Get the second luminance matrix
    Cb = macroBlock(:,:,5);  %# Get the Cb matrix
    
  • 在单元格数组中存储数据:

    由于您的所有矩阵都是相同的大小,因此上述连接选项可能是最佳选择。但是,另一个选项(如果要存储不同大小,类型或维度的数据,则特别有用)是使用cell arrays。以下内容创建了一个包含上述矩阵的 1 x 6 单元格数组:

    macroBlock = {L1 L2 L3 L4 Cb Cr};
    

    然后,您可以通过以下方式对macroBlock进行索引,以访问所需的 8 x 8 矩阵:

    L2 = macroBlock{2};  %# Get the second luminance matrix
    Cb = macroBlock{5};  %# Get the Cb matrix
    
  • 在结构中存储数据:

    另一种选择是使用structure来存储 8 x 8 矩阵。结构的好处是,您可以按字段名称访问数据,而不必记住索引值。以下是初始化结构的方法:

    macroBlock = struct('L1',L1,'L2',L2,'L3',L3,'L4',L4,'Cb',Cb,'Cr',Cr);
    %# OR...
    macroBlock = struct();
    macroBlock.L1 = L1;
    macroBlock.L2 = L2;
    macroBlock.L3 = L3;
    macroBlock.L4 = L4;
    macroBlock.Cb = Cb;
    macroBlock.Cr = Cr;
    

    上述两种语法创建了一个字段名称为'L1''L2''L3''L4''Cb''Cr'的结构。然后,您可以通过以下方式对macroBlock进行索引,以访问所需的 8 x 8 矩阵:

    L2 = macroBlock.L2;  %# Get the second luminance matrix
    Cb = macroBlock.Cb;  %# Get the Cb matrix
    

答案 1 :(得分:0)

我没得到你需要的东西。 将图像分割成那些块的代码?

你应该创建的是一个矩阵I(i,j,m,n)其中m,n代表图像的第n个和第m个8X8块,而i,j指的是一个特定的像素。块。