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

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

Akzeptierte Antwort

Shunichi Kusano
Shunichi Kusano am 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 Kommentare
Akira Agata
Akira Agata am 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. am 30 Nov. 2020
なるほど!
mat2cellでは、arrayが直接分割される事を利用しているのですね。
大変勉強になります。
ご回答ありがとうございました。

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Kategorien

Mehr zu 行列および配列 finden Sie in Help Center und File Exchange

Produkte


Version

R2020a

Community Treasure Hunt

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

Start Hunting!