2009-10-28 15 views
12

Mam obraz 256x256 i chcę podzielić go na 4 bloki po 128x128 każdy i adresować je jako A1 do A4. Teraz chcę je wywołać osobno i wykonać na nich pewne operacje. Wiem, że można to zrobić za pomocą funkcji blkproc - ale jak dokładnie?Jak podzielić obraz na bloki w programie MATLAB?

Czy dzwonię pod numer blkproc w ten sposób?

B=blkproc(I,[4 4],?) 

Co mam umieścić w miejscu "?" I jak mogę adresować 4 bloki utworzone?

Odpowiedz

11

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.

3

Jeśli myImage to 256x256 obraz, nie byłoby

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 to nowa nazwa dla blkproc (która jest przestarzała). Można go użyć do zastosowania funkcji do każdego bloku w obrazie. Na przykład, jeśli chcesz podzielić macierz I w blokach 8x8 i obliczyć średnią z każdego bloku, to byłoby to zrobić:

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

B jest następnie matrycę zawierającą środki bloków.

Dwie rzeczy do odnotowania tutaj:

  • specyfikatorem [8 8] Określa rozmiar bloków, a nie numer bloków.

  • Nie otrzymujesz dostępu do samych bloków poza funkcją, którą przekazujesz do blockproc. Jeśli potrzebujesz same bloki, trzeba zrobić jak sugeruje 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); 
    

    oczywiście w prawdziwym programie, należy prawdopodobnie to zrobić za pomocą pętli.

+2

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

1

Lepiej, aby program działał dla wszystkich rozmiarów obrazów nie tylko dla 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];

% nadzieja ta będzie przydatna dla Ciebie.

Powiązane problemy