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

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

Respuesta aceptada

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

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre 行列および配列 en Help Center y File Exchange.

Etiquetas

Productos


Versión

R2020a

Community Treasure Hunt

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

Start Hunting!