2009-03-25 8 views
8

Robię wyodrębnianie funkcji z obrazu w programie Matlab. Muszę zastosować do tego celu wiele funkcji w oknach nXn (np. Znaleźć wariancję dla każdego okna 3X3 itd.).
Czy istnieje łatwy i skuteczny sposób na to zrobić w Matlab innym niż pętla nad macierzą i zbierając elementy okna za każdym razem?
Dla niektórych funkcji udało mi się znaleźć odpowiednik maski i zastosować je przy użyciu filtra2, ale dla wielu innych nie wydaje mi się, żebym miał taki luksus (jeden dobry przykład: mediana okno 3X3).
Co chcę coś jak arrayfun, ale coś, co odnosi się do okien nxn, a nie poszczególnych elementów.
Dzięki
SundarJak zastosować ruchome okna do macierzy 2D w MATLAB?

+0

Może pomóc, jeśli możesz zaktualizować pytanie i wyświetlić konkretne operacje, które chcesz zastosować do okienkowych elementów. Mogą istnieć sposoby zamiany ich w maski/elementy filtrujące do użycia z FILTER2 (lub ewentualnie CONV2). – gnovice

+0

czy masz przybornik do przetwarzania obrazu? – Azim

Odpowiedz

4

Jeśli masz przybornik do przetwarzania obrazu, możesz użyć bloku blkproc do przetworzenia bloków obrazu przy użyciu niestandardowych funkcji zdefiniowanych przez użytkownika nxm. Oto przykład

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 

Uwaga:

Jak MATLAB Image Processing Toolbox za 2009b, blkproc został depcrecated i zastąpione blockproc (patrz punkt R2099b here). Zatem dwie ostatnie linie można zmienić na:

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

Dziękuję, mam zestaw narzędzi do przetwarzania obrazu i to jest dokładnie to, czego potrzebowałem. – sundar

+0

Twoje powitanie. cieszę się, że pomogło – Azim

+0

Pomoc dla tej funkcji wskazywała na "zbieranie". Okazuje się, że kolaps z "przesuwnym" oknem czyni moją pracę jeszcze łatwiejszą. Dziękuję za udostępnienie mi nowej tablicy funkcji. – sundar

Powiązane problemy