縦方向、もしくは横方向のみに規定幅(50ピクセル)での畳み込みを行いたいのですが
Show older comments
50*50ピクセルの画像を横方向に5枚、縦方向に4枚づつ並べた、一枚の写真の行列画像(5*4=250*200ピクセル)を用意します。その画像をCNNにかけるために畳み込みをしたいのですが、行列画像の各要素の情報を畳み込みたいため、縦、横それぞれで畳み込みをしたいです。イメージは以下の図の通りです。このような縦方向、もしくは横方向のみに規定幅(50ピクセル)での畳み込みを行いたいのですがMATLABで行うにはどのような操作が必要になりますでしょうか。お力をお貸しください。

Accepted Answer
More Answers (2)
Atsushi Ueno
on 8 Mar 2022
Edited: Atsushi Ueno
on 9 Mar 2022
MATLABなら(他の言語でも)、上図の様に50*50*5*4にすれば考え易いです。

base = imread('coins.png');
base = base(51:100, 51:100); % baseは50*50ピクセルの画像
stack = repmat(base,[1 1 5 4]); % 横方向に5枚、縦方向に4枚づつ重ねる
size(stack)
for i = 1:size(stack,1)
for j = 1:size(stack,2)
cnv1(i,j) = mean(stack(i,j,:,1)); % 横方向に5枚串刺しで画素値を平均する(変わらない)
cnv2(i,j) = mean(stack(i,j,1,:)); % 縦方向に4枚串刺しで画素値を平均する(変わらない)
end % 畳み込みの演算内容は適当に平均(mean関数)にしました
end
cnv1 = uint8(cnv1); % 結果は元の画像(base)と同じ
cnv2 = uint8(cnv2); % 結果は元の画像(base)と同じ
Atsushi Ueno
on 9 Mar 2022
image processing toolboxがあれば、上記の各種関数を参考にすべきと思います。
base = imread('coins.png');
base = base(51:100, 51:100); % baseは50*50ピクセルの画像
stack = repmat(base,[1 1 5 4]); % 横方向に5枚、縦方向に4枚づつ重ねる
fun = @(block_struct) mean(block_struct.data(:,:,:)); % 畳み込みの代わりに平均を演算する関数
tate = uint8(blockproc(squeeze(stack(:,:,:,1)),[1 1],fun)); % 横方向に5枚串刺しで画素値を平均する(変わらない)
yoko = uint8(blockproc(squeeze(stack(:,:,1,:)),[1 1],fun)); % 縦方向に4枚串刺しで画素値を平均する(変わらない)
% blockproc関数は画像データを想定していて3次元データしか受け付けないので
% 縦と横それぞれのデータを引数に渡す際にsqueze関数で1次元減らしています。
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!
