2016-06-28 91 views
0

我已經將512X512圖像分成2X2像素塊。因此我總共有65536個街區。每個塊有四個像素。如何隨機遍歷塊的圖像?

Image divided into blocks like this

現在我要遍歷以隨機順序圖像。例如:從第6塊開始,然後到第3塊,然後到第8塊,然後到第1塊......像這樣,直到整個圖像被遍歷。

重要提示:我需要存儲遍歷順序以備後用。

請幫我寫一個MATLAB代碼。許多許多人提前感謝。

+2

定義_traverse_:您想對每個塊做什麼? –

+0

其中格式是圖片,你已經有一個matlab中的單個塊? – Finn

+0

謝謝。遍歷意味着從一個塊到另一個塊,直到到達所有塊。在訪問每個塊之後,我會對該塊進行一些操作,然後轉到另一個塊。我可以以光柵掃描順序遍歷或掃描塊。但不是隨機的順序:-( – matlabcoder

回答

1

容易,讓我們的小矩陣(6×6)爲例

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

您將有大小2×2塊(共3×3 = 9塊)。 將矩陣重塑爲2 x 18矩陣。

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

現在產生由塊的大小分離索引的隨機置換:

idx = randperm(nblocks) * blocksize; 

的Et瞧。現在,您可以訪問第5塊只是在做:

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

使用循環橫向每個塊。

+0

謝謝,遍歷意味着從一個塊到另一個塊,直到所有塊都到達,訪問完每個塊之後,我將對該塊進行一些操作,然後轉到另一個塊。 – matlabcoder

+0

我們可以使用循環嗎? – matlabcoder

+0

我們是否可以使用循環掃描或隨機順序遍歷,因爲我需要存儲遍歷順序以供以後使用 – matlabcoder

1

您可以將圖像分成塊並使用this great answer沿第三維平鋪。然後循環遍歷第三維索引的隨機排列:

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