質問: 複数の画像の複数の要素配列を、特定の間隔で再配置するプログラムの構築に関して 前回、画像などの配列から特定サイズで区切られた部分配列を取り出す方法、に関して質問したものです。 今回それらの取り出した部分配列同士を、一つの大きな配列に決まった間隔で挿入するコードをfor loopを使用せずに実装出来ないか、と言うことに関してご質問があります。 まず具体的に行いたい状況を説明します。(字が汚くて申し訳ありません) 上図のように16画素ある像が4枚ある場合を考えます。 それぞれの画像の各画素を仮に1-1,1-2,1-3...のように表現します。(image 1を参照) これらの画像から、部分配列を取り出す方法は、前回の質問でfor loopを利用せずに取り出せることがわかりました。 具体的に述べると、上図のimage 1を4分割した、[1-1,1-2;1-5,1-6]のような部分配列4つloop無しで取得することが出来ています。 次に、それらの2x2の部分配列を上図下側の大きな配列として組み合わせて一つの大きな画像の作成を考えていますが、作成がうまくいきません。 ご助言頂けると幸いです。
回答: 頭がこんがらがってきますね。部分行列を得るところはmat2cellで簡単にしてから、それらを所望の形に敷き詰めなおすということで、書いてみました。ものすごくわかりづらいですが、reshapeとpermuteを駆使しています。もっとショートカットして書けるのかもしれません。図を書くのもちょっと大変なので、申し訳ありませんが何やってるのかまで説明できません(汗)。一行ずつ結果を見ていただければと思います。一応一般化していますので、ご所望の例だとm=2,n=2,wm=2,wn=2というケースになるかと思います。 % テスト画像を適当につくる im1 = repmat([1 2],[4,3]); im2 = repmat([3 4],[4,3]); im3 = repmat([5 6],[4 3]); im4 = repmat([7 8],[4 3]); % 部分画像の大きさを決める wm = 2, wn = 2; % 部分画像の行方向、列方向の数 m = size(im1,1) / wm n = size(im1,2) / wn % マージしたい画像をひとまとめにする im = cat(3,im1, im3, im2, im4); % 部分画像をセルに入れて、簡単にする。 imc = mat2cell(im,ones(1,m)*wm,ones(1,n)*wn,ones(1,wm*wn)); % 行方向に1 3 2 4 の順番で並べる。これを1セットと考える。列方向は要素数になる。 imc = reshape(imc,m*n,wm*wn)'; % 1,2次元で1セット、3,4次元でm行n列 imc = reshape(imc,wm,wn,m,n); % 次元を入れ替えて、reshapeに備える imc = permute(imc,[1 3 2 4]); % 最終形態に imc = reshape(imc,wm*m,wn*n); im_merge = cell2mat(imc);