複数の画像の複数の要​素配列を、特定の間隔​で再配置するプログラ​ムの構築に関して

4 ビュー (過去 30 日間)
K.S.
K.S. 2020 年 11 月 30 日
コメント済み: Shunichi Kusano 2020 年 12 月 3 日
前回、画像などの配列から特定サイズで区切られた部分配列を取り出す方法、に関して質問したものです。
今回それらの取り出した部分配列同士を、一つの大きな配列に決まった間隔で挿入するコードを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の部分配列を上図下側の大きな配列として組み合わせて一つの大きな画像の作成を考えていますが、作成がうまくいきません。
ご助言頂けると幸いです。

採用された回答

Shunichi Kusano
Shunichi Kusano 2020 年 12 月 2 日
頭がこんがらがってきますね。部分行列を得るところは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);
  2 件のコメント
K.S.
K.S. 2020 年 12 月 3 日
ご回答誠にありがとうございます。
やはり、この場合はloopを組んだ方がわかりやすい気がしてきました。
一応こちらで作ったコードは以下となります。
計算が簡略化できる部分があればご教示頂けると幸いです。
Shunichi Kusano
Shunichi Kusano 2020 年 12 月 3 日
おっしゃる通り、非常に可読性が低くなってしまいました。
作成されたコードを拝見しました。きちんと精査できていませんが、私もforを使うならこんな感じに書くと思います。わかりやすさ重視の場合、このやり方がいいと思います。

サインインしてコメントする。

その他の回答 (0 件)

製品


リリース

R2020a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!