2009-10-28 16 views
12

Ho un'immagine 256x256 e voglio dividerlo in 4 blocchi di 128x128 ciascuno e indirizzarli come A1 a A4. Ora voglio chiamarli separatamente e fare alcune operazioni su di loro. So che questo può essere fatto usando la funzione blkproc - ma con quale precisione?Come dividere un'immagine in blocchi in MATLAB?

Devo chiamare blkproc in questo modo?

Cosa mettere al posto di "?" E come posso indirizzare i 4 blocchi creati?

risposta

11

Dal blockproc (e deprecato blkproc) sono entrambe le funzioni nella Image Processing Toolbox, ho pensato di aggiungere una soluzione di MATLAB di base che non richiede ulteriori cassette ...

Se si desidera dividere un matrice in sottomatrici, un modo è quello di utilizzare mat2cell per interrompere la matrice e memorizzare ogni sottotitolo in una cella di un array di celle. Per il caso, la sintassi sarà simile questo:

C = mat2cell(I, [128 128], [128 128]); 

C è ora una matrice di celle 2-by-2 con ciascuna cella memorizza un sottomatrice 128-by-128 di I. Se si desidera eseguire un'operazione su ciascuna cella, è possibile utilizzare la funzione cellfun. Ad esempio, se si voleva prendere la media dei valori in ogni sottomatrice, si dovrebbe effettuare le seguenti operazioni:

meanValues = cellfun(@(x) mean(x(:)), C); 

Il primo argomento è un function handle a un anonymous function che prima rimodella ogni sottomatrice in un vettore colonna e poi prende la media. L'output è una matrice 2 per 2 dei valori medi per ogni submatrix.Se la funzione si passa alla cellfun crea uscite di diverse dimensioni o tipi per ogni cella, quindi cellfun avrà un problema loro concatenazione e genera un errore:

??? Error using ==> cellfun 
Non-scalar in Uniform output, at index 1, output 1. 
Set 'UniformOutput' to false. 

Se si aggiunge ..., 'UniformOutput', false); alla fine del tuo invito cellfun, quindi l'output nel caso precedente sarà invece un array di celle 2-by-2 contenente i risultati dell'esecuzione dell'operazione su ciascuna sottomatrice.

3

Se myImage è la tua immagine 256x256, non sarebbe

image_top_left = myImage(1:128,1:128); 
image_top_right = myImage(1:128,129:256); 
image_bottom_left = myImage(129:256,1:128); 
image_bottom_right = myImage(129:256,129:256); 

?

6

blockproc è il nuovo nome per blkproc (che è deprecato). Può essere usato per applicare una funzione a ciascun blocco di un'immagine. Ad esempio, se si vuole dividere una matrice che in blocchi 8x8 e calcolare la media di ogni blocco, si esegue questa operazione:

B=blockproc(I, [8 8], @(x) mean(x.data(:))); 

B è allora una matrice contenente i mezzi dei blocchi.

Due cose da notare qui:

  • L'identificatore [8 8] specifica la dimensione dei blocchi, non il numero di di blocchi.

  • Non si ha accesso ai blocchi stessi al di fuori della funzione passata a blockproc. Se avete bisogno dei blocchi stessi, quello che dovete fare come suggerito Adrien:

    A1=I(1:128, 1:128); 
    A2=I(129:256, 1:128); 
    A3=I(1:128, 129:256); 
    A4=I(129:256, 129:256); 
    

    Naturalmente, in un vero e proprio programma, probabilmente si dovrebbe fare questo utilizzando un ciclo.

+2

Se si sta ancora utilizzando una versione precedente di Image Processing Toolbox con la funzione BLKPROC, la sintassi dell'esempio precedente cambierà in: 'B = blkproc (I, [8 8], @ (x) significa (x (:))); ' – gnovice

1

E 'meglio per voi far funzionare il vostro programma per tutte le dimensioni di immagini non solo per 256 * 256.

[row, col]=size(your_image); mr = round(row/2); % median of rows mc = round(col/2); % median of columns % Now divide your image and call each of them separately and do what ever you want top_left = your_image(1:mr , 1:mc); top_right = your_image(1:mr , (mc+1):col); bot_left = your_image((mr+1):row , 1:mc); bot_right = your_image((mr+1):row , (mc+1):col); % final stage is to combining these parts again to return to its original shape Back_to_original = [top_left,top_right ; bot_left,bot_right];

% speranza che questo sarà utile per voi.