MPEG-1 di compressione - macroblocchi produzione
-
13-09-2019 - |
Domanda
Sono bloccato con un problema di fondo nel mio compressione MPEG-1. Devo produrre macroblocchi all'interno di un'immagine. Un macroblocco consiste di 16 x 16 pixel - dove 4 x 8x8 è luminanza, 1 x 8x8 è Cb e Cr 1 x 8x8. In MATLAB voglio produrre una matrice di celle che contiene questo. Qualche suggerimento?
Soluzione
Sembra che si sta cercando di capire il modo migliore per raccogliere i vari 8-by-8 matrici in una singola variabile. Ci sono alcuni modi si può fare questo (con la prima opzione che è quello che avrei scelto per il vostro caso):
-
Concatenating dati in una matrice 3-D:
È possibile utilizzare la funzione CAT per impilare matrici della stessa dimensione lungo una determinata dimensione. Ad esempio, se avete il vostro 4 8-by-8 matrici di luminanza nelle variabili
L1
,L2
,L3
, eL4
, il seguente sarà concatenare in un 8-by-8- by-4 matrice:luminance = cat(3,L1,L2,L3,L4);
Si potrebbe anche aggiungere le ulteriori
Cb
eCr
matrici per creare un matrice 8-by-8-by-6:macroBlock = cat(3,L1,L2,L3,L4,Cb,Cr); %# OR... macroBlock = cat(3,luminance,Cb,Cr); %# Using luminance variable from above
È possibile quindi indice
macroBlock
nel seguente modo per accedere qualunque sia 8-by-8 matrici necessari:L2 = macroBlock(:,:,2); %# Get the second luminance matrix Cb = macroBlock(:,:,5); %# Get the Cb matrix
-
L'archiviazione dei dati in un array di celle:
Dato che tutte le matrici sono le stesse dimensioni, l'opzione di concatenazione di cui sopra è probabilmente la cosa migliore. Tuttavia, un'altra opzione (che è particolarmente utile se si desidera memorizzare i dati di varie dimensioni, tipo o dimensione) è quello di utilizzare array di celle . crea la seguente un 1-by-6 array cella contenente le matrici di cui sopra:
macroBlock = {L1 L2 L3 L4 Cb Cr};
È possibile quindi indice
macroBlock
nel seguente modo per accedere qualunque sia 8-by-8 matrici necessari:L2 = macroBlock{2}; %# Get the second luminance matrix Cb = macroBlock{5}; %# Get the Cb matrix
-
Memorizzazione dati in una struttura:
Un'altra opzione è quella di utilizzare un struttura per memorizzare le 8-by-8 matrici. Una struttura ha il vantaggio che si può accedere ai dati al nome di campo invece di dover ricordare un valore di indice. Ecco come si dovrebbe inizializzare una struttura:
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;
I due sintassi sopra creano una struttura con i nomi dei campi
'L1'
,'L2'
,'L3'
,'L4'
,'Cb'
e'Cr'
. È quindi possibile indicemacroBlock
nel seguente modo per accedere qualunque sia 8-by-8 matrici necessari:L2 = macroBlock.L2; %# Get the second luminance matrix Cb = macroBlock.Cb; %# Get the Cb matrix
Altri suggerimenti
non ho avuto quello che ti serve. Un codice quale partizione l'immagine in quei blocchi?
Che cosa si dovrebbe creare è una matrice I (i, j, m, n) dove m, n sta per l'n-esimo e il blocco 8X8 m'th dell'immagine e i, j si riferisce ad un pixel specifico all'interno del blocco.