2009-10-28 14 views
12

Ich habe ein 256x256 Bild und ich möchte es in 4 Blöcke von 128x128 teilen und sie als A1 bis A4 adressieren. Jetzt möchte ich sie separat aufrufen und einige Operationen an ihnen vornehmen. Ich weiß, dass dies mit der blkproc Funktion getan werden kann - aber wie genau?Wie teilt man ein Bild in Blöcke in MATLAB?

Anruf ich blkproc so?

Was stelle ich anstelle des "?", Und wie kann ich die 4 erstellten Blöcke ansprechen?

Antwort

11

Seit blockproc (und die veraltete blkproc) sind beide Funktionen in der Image Processing Toolbox, ich dachte, dass ich eine grundlegende MATLAB Lösung hinzufügen würde, die keine zusätzlichen Werkzeugkästen erfordert ...

Wenn Sie ein teilen möchten Matrix in Submatrizen, eine Möglichkeit besteht darin, mat2cell zu verwenden, um die Matrix aufzubrechen und jede Submatrix in einer Zelle eines Zellenarrays zu speichern. Für Ihren Fall würde die Syntax wie folgt aussehen:

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

C ist nun ein 2-by-2 Zellenfeld mit jeder Zelle eine 128-by-128 Submatrix von I speichern. Wenn Sie für jede Zelle eine Operation ausführen möchten, können Sie die Funktion cellfun verwenden. Zum Beispiel, wenn Sie den Mittelwert des Wertes in jeder Submatrix nehmen wollen, würden Sie wie folgt vor:

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

Das erste Argument ein function handle zu einem anonymous function ist, die zunächst jede Submatrix in einen Spaltenvektor umformt und dann nimmt den Mittelwert. Die Ausgabe ist eine 2-mal-2-Matrix der Mittelwerte für jede Untermatrix.Wenn die Funktion, die Sie cellfun passieren Ausgänge verschiedener Größen oder Typen für jede Zelle schafft, dann wird cellfun ein Problem, sie verketten haben und wird einen Fehler werfen:

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

Wenn Sie ..., 'UniformOutput', false); bis zum Ende des Anrufs in den cellfun, dann wird die Ausgabe in dem obigen Fall stattdessen ein 2-by-2 Zellenarray sein, das die Ergebnisse der Durchführung der Operation für jede Submatrix enthält.

3

Wenn myImage Ihr 256x256 Bild, wäre es

sein nicht
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 ist der neue Name für blkproc (die veraltet ist). Es kann verwendet werden, um eine Funktion auf jeden Block in einem Bild anzuwenden. Zum Beispiel, wenn Sie eine Matrix I in 8x8-Blöcke und berechnen den Mittelwert jedes Blocks teilen wollten, würden Sie dies tun:

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

B ist dann eine Matrix, die die Mittel der Blöcke enthalten.

Zwei Dinge zu beachten:

  • Der Spezifizierer [8 8] gibt die Größe der Blöcke, nicht die Zahl von Blöcken.

  • Sie erhalten keinen Zugriff auf die Blöcke selbst außerhalb der Funktion, die Sie an blockproc übergeben. Wenn Sie die Blöcke selbst benötigen, müssen Sie tun, wie Adrien vorgeschlagen:

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

    Natürlich in einem realen Programm, sollten Sie wahrscheinlich dies tun mit einer Schleife.

+2

Wenn Sie immer noch eine alte Version der Image Processing Toolbox mit der BLKPROC-Funktion verwenden, ändert sich die Syntax des obigen Beispiels in: 'B = blkproc (I, [8 8], @ (x) mean (x (:))); ' – gnovice

1

Es ist besser für Sie, Ihr Programm für alle Größen von Bildern nicht nur für 256 * 256 arbeiten zu lassen.

[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];

% hoffen, dass diese für Sie von Nutzen sein wird.

Verwandte Themen