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?

È stato utile?

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, e L4, 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 e Cr 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 indice macroBlock 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top