0

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

4

2 回答 2

1

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

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

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

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

    您还可以添加附加矩阵CbCr矩阵来创建一个8×8×6矩阵:

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

    然后,您可以通过以下方式索引macroBlock来访问您需要的任何 8×8矩阵:

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

    由于所有矩阵的大小都相同,因此上述串联选项可能是最好的。但是,另一种选择(如果要存储不同大小、类型或维度的数据特别有用)是使用元胞数组。下面创建一个包含上述矩阵的1×6元胞数组:

    macroBlock = {L1 L2 L3 L4 Cb Cr};
    

    然后,您可以通过以下方式索引macroBlock来访问您需要的任何 8×8矩阵:

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

    另一种选择是使用结构来存储8×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×8矩阵:

    L2 = macroBlock.L2;  %# Get the second luminance matrix
    Cb = macroBlock.Cb;  %# Get the Cb matrix
    
于 2009-12-29T16:55:57.933 回答
0

我没有得到你需要的东西。将图像划分为这些块的代码?

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

于 2009-12-29T10:20:31.463 回答