2016-06-28 2 views
0

私は512X512イメージを2X2ピクセルブロックに分割しました。したがって私は合計65536ブロックを持っています。各ブロックは4つのピクセルを有する。ブロック間でイメージをランダムにトラバースする方法は?

Image divided into blocks like this

今私は、ランダムな順序で画像をトラバースします。たとえば、6番目のブロックから3番目のブロック、次に8番目のブロック、1番目のブロックまで、......このように画像全体が移動するまで。

重要:後で使用するために移動順序を保存する必要があります。

このためにMATLABコードを書くのを手伝ってください。事前に多くの多くの多くのありがとう。

+2

定義:_traverse_:各ブロックで何をしたいですか? –

+0

どの形式で画像がありますか?あなたはすでにMATLABに個々のブロックを持っていますか? – Finn

+0

ありがとうございます。横断とは、すべてのブロックに到達するまで、あるブロックから別のブロックに移動することを意味します。各ブロックにアクセスした後、私はそのブロックで何らかの操作を行い、別のブロックに行きます。私は、ラスタスキャン順にブロック全体を走査することができます。しかし、ランダムな順序ではありません:-( – matlabcoder

答えて

1

簡単に、あなたが(合計3×3 = 9つのブロックで)サイズの2×2のブロックを持っていますのは、小行列(6×6)

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

で例を作ってみよう。 マトリックスを2 x 18マトリックスに変更します。

idx = randperm(nblocks) * blocksize; 

のEtほら:

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

今ブロックのサイズによって分離されたインデックスのランダム順列を生成します。今すぐ次の5ブロックにアクセスできます。

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

ループを使用して各ブロックを横断します。

+0

ありがとうございます。横断すると、あるブロックから別のブロックに到達するまでの間に、すべてのブロックに到達するまでのことです。各ブロックにアクセスしたら、そのブロックで何らかの操作を行い、別のブロックに移動します。 – matlabcoder

+0

ループを使用できますか? – matlabcoder

+0

私たちはループを使ってスキャンやトラバースをランダムに行うことができます。後で使うためにトラバースオーダーを保存する必要があるので – matlabcoder

1

イメージをブロックに分割し、this great answerを使用して3次元に沿ってタイルすることができます。

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 
関連する問題