2016-06-28 18 views
0

Ich habe ein 512X512 Bild in 2X2 Pixel Blöcke geteilt. Also habe ich insgesamt 65536 Blöcke. Jeder Block hat vier Pixel.Wie durchquert man ein Bild zufällig über die Blöcke?

Image divided into blocks like this

Jetzt möchte ich das Bild in zufälliger Reihenfolge zu durchlaufen. Zum Beispiel: vom 6. Block, dann zum 3. Block, dann zum 8., dann zum 1. Block ...... so, bis das ganze Bild durchlaufen ist.

Wichtig: Ich muss den Verfahrauftrag für die spätere Verwendung speichern.

Bitte helfen Sie mir einen MATLAB-Code dafür zu schreiben. Vielen vielen vielen Dank im Voraus.

+2

Definieren Sie _traverse_: Was möchten Sie mit jedem Block machen? –

+0

in welchem ​​Format ist das Bild und hast du schon die einzelnen Blöcke in Matlab? – Finn

+0

Danke. Traversieren heißt von Block zu Block gehen, bis alle Blöcke erreicht sind. Nachdem ich auf jeden Block zugegriffen habe, werde ich einige Operationen für diesen Block durchführen und dann zu einem anderen Block gehen. Ich kann quer durch die Blöcke in der Raster-Scan-Reihenfolge navigieren oder scannen. Aber nicht in zufälliger Reihenfolge :-( – matlabcoder

Antwort

1

einfach, lassen Sie uns ein Beispiel mit kleinen Matrix (6x6) machen

Im = rand(6,6); 
nblocks = 9; 
blocksize = 2; 

Sie Blöcke der Größe 2x2 haben (insgesamt 3x3 = 9 Blöcke). Die Matrix in eine 2 x 18-Matrix umformen.

idx = randperm(nblocks) * blocksize; 

Et voilà:

Im = reshape(Im, numel(Im)/blocksize, blocksize); 

nun eine zufällige Permutation der Indizes durch die Größe des Blocks getrennt erzeugen. Jetzt können Sie auf den fünften Block zugreifen:

currentblock = Im(idx(5):idx(5)+blocksize, :); 

Verwenden Sie eine Schleife, um jeden Block zu transversieren.

+0

Vielen Dank, Traversieren bedeutet, von einem Block zum anderen zu gehen, bis alle Blöcke erreicht sind.Nachdem ich auf jeden Block zugegriffen habe, werde ich einige Operationen an diesem Block durchführen und dann zu einem anderen Block gehen. – matlabcoder

+0

können wir Schleifen verwenden? – matlabcoder

+0

können wir Loops verwenden, um in zufälliger Reihenfolge zu scannen oder zu traversieren, weil ich die Traversierungsreihenfolge für die spätere Verwendung speichern muss – matlabcoder

1

Sie können das Bild in Blöcke unterteilen und sie entlang einer dritten Dimension mit this great answer kacheln. Sie durchlaufen dann eine zufällige Permutation der Indizes der dritten Dimension:

A = randn(12,12); 
m = 3; 
n = 6; 
T = permute(reshape(permute(reshape(A, size(A, 1), n, []), [2 1 3]), n, m, []), [2 1 3]); 
% each third-dim slice is an mxn block 
scan_order = randperm(size(T,3)); % random permutation of block indices 
for b = scan_order 
    block = T(:,:,b); 
    % Do stuff with current block 
end