複数の画像の複数の要素配列を、特定の間隔で再配置するプログラムの構築に関して
5 views (last 30 days)
Show older comments
前回、画像などの配列から特定サイズで区切られた部分配列を取り出す方法、に関して質問したものです。
今回それらの取り出した部分配列同士を、一つの大きな配列に決まった間隔で挿入するコードをfor loopを使用せずに実装出来ないか、と言うことに関してご質問があります。
まず具体的に行いたい状況を説明します。(字が汚くて申し訳ありません)
上図のように16画素ある像が4枚ある場合を考えます。
それぞれの画像の各画素を仮に1-1,1-2,1-3...のように表現します。(Image 1を参照)
具体的に述べると、上図のImage 1を4分割した、[1-1,1-2;1-5,1-6]のような部分配列4つloop無しで取得することが出来ています。
次に、それらの2x2の部分配列を上図下側の大きな配列として組み合わせて一つの大きな画像の作成を考えていますが、作成がうまくいきません。
ご助言頂けると幸いです。
0 Comments
Accepted Answer
Shunichi Kusano
on 2 Dec 2020
頭がこんがらがってきますね。部分行列を得るところは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 Comments
Shunichi Kusano
on 3 Dec 2020
おっしゃる通り、非常に可読性が低くなってしまいました。
作成されたコードを拝見しました。きちんと精査できていませんが、私もforを使うならこんな感じに書くと思います。わかりやすさ重視の場合、このやり方がいいと思います。
More Answers (0)
See Also
Categories
Find more on イメージ算術 in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!