MPEG-1 圧縮の基本的な問題で立ち往生しています。画像内でマクロブロックを生成する必要があります。マクロブロックは 16 x 16 ピクセルで構成されます。ここで、4 x 8x8 は輝度、1 x 8x8 は Cb、1 x 8x8 Cr です。MATLAB では、これを含むセル マトリックスを作成したいと考えています。助言がありますか?
2 に答える
さまざまな8行8列の行列を1つの変数に収集するための最良の方法を見つけようとしているようです。これを行うにはいくつかの方法があります(最初のオプションは私があなたのケースに選択するものです):
データを3Dマトリックスに連結する:
CAT関数を使用して、特定の次元に沿って同じサイズの行列をスタックできます。たとえば、変数、、、、およびに4つの8 x 8輝度マトリックスがある場合、以下はそれらを8 x 8x4マトリックスに連結します。
L1
L2
L3
L4
luminance = cat(3,L1,L2,L3,L4);
Cb
追加の行列と行列を追加して、 8Cr
x 8x6の行列を作成することもできます。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
構造体へのデータの保存:
もう1つのオプションは、構造体を使用して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;
上記の2つの構文は、フィールド名、、、、、、、およびの構造
'L1'
を作成します。次に、次の方法でインデックスを作成して、必要な8行8列のマトリックスにアクセスできます。'L2'
'L3'
'L4'
'Cb'
'Cr'
macroBlock
L2 = macroBlock.L2; %# Get the second luminance matrix Cb = macroBlock.Cb; %# Get the Cb matrix
私はあなたが必要とするものを手に入れませんでした。画像をそれらのブロックに分割するコードは?
作成する必要があるのは行列 I(i, j, m ,n) です。ここで、m, n は画像の n 番目と m 番目の 8X8 ブロックを表し、i, j はブロック内の特定のピクセルを表します。