2016-06-28 104 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