二次元配列から特定形​状の二次元配列を取り​出す方法 (例 4x​4 → 2x2x4等)

8 views (last 30 days)
K.S.
K.S. on 27 Nov 2020
Commented: K.S. on 30 Nov 2020
画像処理を行う一環で、以下のような二次元配列(画像)から特定サイズの配列抽出をfor loopを用いずに行いたいです。
上記のようなことはfor loopを利用すればできるのはわかりますが、これらをfor loopを用いずに抽出することは可能でしょうか?
4x4 を2x2x4のように。

Accepted Answer

Shunichi Kusano
Shunichi Kusano on 27 Nov 2020
こんにちは。
もっといい方法があるかもしれませんが、im2col関数とreshape関数を組合わせる方法がわかりやすいかなと思いました。
A = [1 1 2 2;1 1 2 2;3 3 4 4;3 3 4 4]
im2col(A,[2 2],'distinct') % どういう出力になるか見てみてください
reshape(im2col(A,[2 2],'distinct'),[2 2 4]) % im2colの出力をさらに並べ替えて、ご所望の形にしています。
ただこのやり方ですと3次元目が1 3 2 4の順で出力される(行方向がデフォルトの優先順位)ので、もし1 2 3 4の順にしたい場合は、処理前に
A = A';
で転置することになるかなと思います。
  3 Comments
Akira Agata
Akira Agata on 28 Nov 2020
こんばんは。
たまたま別の方法を思いついたので、ご参考までに紹介します。
A = [1 1 2 2;1 1 2 2;3 3 4 4;3 3 4 4];
% 2×2の配列に分割
c = mat2cell(A,[2 2],[2 2]);
% 並べ替え
c = reshape(c,1,1,4);
% 数値配列に変換
B = cell2mat(c);
こちらも、このままではBの3次元目が1 3 2 4の順で出力されますので、もし1 2 3 4の順にしたい場合は、処理前に配列Aを転置させてみてください。
K.S.
K.S. on 30 Nov 2020
なるほど!
mat2cellでは、arrayが直接分割される事を利用しているのですね。
大変勉強になります。
ご回答ありがとうございました。

Sign in to comment.

More Answers (0)

Categories

Find more on 行列および配列 in Help Center and File Exchange

Products


Release

R2020a

Community Treasure Hunt

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

Start Hunting!