2009-03-25 24 views
8

Sto eseguendo l'estrazione di caratteristiche da un'immagine in Matlab. Devo applicare molte funzioni su nXn windows per questo scopo (come trovare la varianza su ciascuna finestra 3X3, ecc.
Esiste un modo semplice ed efficace per farlo in Matlab oltre al loop sulla matrice e raccogliere gli elementi della finestra ogni volta?
Per alcune funzioni, sono stato in grado di trovare una maschera equivalente e le ho applicate usando filter2, ma per molte altre non sembra avere un tale lusso (un buon esempio: mediana di una finestra 3X3).
quello che voglio è qualcosa di simile arrayfun, ma qualcosa che si applica a Windows NxN, non i singoli elementi.
Grazie,
SundarCome applicare lo spostamento di finestre su una matrice 2D in MATLAB?

+0

Può essere d'aiuto se è possibile aggiornare la domanda ed elencare le operazioni specifiche che si desidera applicare agli elementi in finestra. Potrebbero esserci modi per trasformarli tutti in maschere/elementi di filtro da utilizzare con FILTER2 (o possibilmente CONV2). – gnovice

+0

hai la cassetta degli attrezzi per l'elaborazione delle immagini? – Azim

risposta

4

Se hai la casella degli strumenti di elaborazione delle immagini, è possibile utilizzare blkproc per elaborare nxm blocchi della vostra immagine utilizzando le funzioni definite personalizzato. Ecco un esempio

function Ip = imageProcessed(II,blockSize) 
    % FUNCTION imageProcessed calculates average value of blocks of size nxm 
    % blocks 
     if nargin<2, 
     % default/example value for block size 
     blockSize = [3 4]; 
     end 

     if size(II,3)>1, 
      % blkproc requires a grayscale image 
      % convert II to gray scale if it is RGB. 
      II=rgb2gray(II) 
     end 


     % Custom average function. 
     myAveFun = @(x) ones(size(x))*sum(x(:))/length(x(:)); 

     % use blkproc to process image 
     Ip = blkproc(II,[blockSize(1), blockSize(2)],myAveFun); 
end 

Nota:

rappresentata di MATLAB 2009b Processing Toolbox, blkproc stato depcrecated e sostituito con blockproc (vedi sezione R2099b here). Quindi le ultime due righe possono essere cambiate in:

myAveFun = @(blkstrct) ones(size(blkstrct.data))*mean(blkstrct.data(:)) 
Ip = blockproc(II,blockSize,myAveFun); 
+0

Grazie, ho gli strumenti per l'elaborazione delle immagini e questo è esattamente ciò di cui avevo bisogno. – sundar

+0

il benvenuto. lieto che abbia aiutato. – Azim

+0

L'aiuto per questa funzione mi ha indirizzato a "colfilt". Risulta colfilt con una finestra 'scorrevole' rende il mio lavoro ancora più facile. Grazie per aver aperto questa nuova gamma di funzioni. – sundar