Od blockproc
(a przestarzałe blkproc
) są obie funkcje w Image Processing Toolbox, myślałem, że dodać podstawowe rozwiązanie MATLAB, który nie wymaga dodatkowych skrzynki na narzędzia ...
Jeśli chcesz podzielić macierz w podmatryce, jednym ze sposobów jest użycie mat2cell
do rozbicia macierzy i przechowywania każdej submatrix w komórce macierzy komórek. W Twoim przypadku, składnia będzie wyglądać następująco:
C = mat2cell(I, [128 128], [128 128]);
C
jest teraz tablica 2-by-2 komórek z każdej komórki przechowującej podmatrycę 128-by-128 I
. Jeśli chcesz wykonać operację na każdej komórce, możesz użyć funkcji cellfun
. Na przykład, jeśli chcesz wziąć średnią z wartości w każdej podmatrycy, należy wykonać następujące czynności:
meanValues = cellfun(@(x) mean(x(:)), C);
Pierwszym argumentem jest function handle do anonymous function który najpierw przekształca każdy podmatrycę do wektora kolumnę, a następnie bierze średnią. Wynik to macierz 2 na 2 wartości średnich dla każdej submatrix.Jeśli funkcja przekazać do cellfun
tworzy wyjść o różnych rozmiarach i typach dla każdej komórki, a następnie cellfun
będą mieć problem ich łączenie i wygeneruje błąd:
??? Error using ==> cellfun
Non-scalar in Uniform output, at index 1, output 1.
Set 'UniformOutput' to false.
Jeśli dodać ..., 'UniformOutput', false);
do końca wezwanie do cellfun
, wówczas wyjściem w powyższym przypadku będzie tablica komórek o rozmiarze 2 na 2, zawierająca wyniki wykonania operacji na każdej podskali.
Jeśli nadal używasz starej wersji narzędzia Image Processing Toolbox z funkcją BLKPROC, składnia powyższego przykładu zmieni się na: 'B = blkproc (I, [8 8], @ (x) mean (x (:))); ' – gnovice