私は任意の寸法の画像を持っていますROWS
とCOLS
。私はこの画像を任意の、しかし一定のストライドstride = [strideR, strideC]
を与えられた任意の一定のサイズのblockSize = [blockSizeR, blockSizeC]
のパッチにタイルしたいと思います。行方向または列方向のパッチ数がそれぞれのブロックサイズが行または列の数と等しくない場合(つまり、余分な行または列がある場合)、私はそれらを気にしません(つまり、無視される)。画像が左上のピクセルから完全に画像に収まる可能性のあるすべてのパッチにタイル張りされていれば十分です。MATLABの任意のストライドで(定数)任意のサイズのパッチに画像をタイルする方法はありますか?
Web上に浮かんでいる可能性のあるソリューションがたくさんありますが、重複が許されないものもあります。余分な行や列があると出力を許可しないものもあれば、forループを非効率的に使うものもあります。
私は必要なものに最も近いものは、おそらくhttps://de.mathworks.com/matlabcentral/answers/330357-how-do-i-store-a-series-of-rgb-images-in-a-2d-arrayに掲載のソリューションです:
%img: source image
stride = [5, 5]; %height, width
blocksize = [11, 11]; %height, width
tilescount = (size(img(:, :, 1)) - blocksize - 1)/stride + 1;
assert(all(mod(tilescount, 1) == 0), 'cannot divide image into tile evenly')
tiles = cell(tilescount);
tileidx = 1;
for col = 1 : stride(2) : size(img, 2) - blocksize(2)
for row = 1 : stride(1) : size(img, 1) - blocksize(1)
tiles{tileidx} = img(row:row+stride(1)-1, col:col+stride(2)-1, :);
tileidx = tileidx + 1;
end
end
しかし、また、スペア行または列が存在しない場合にのみ動作するようです。これを、任意のチャンネル数の画像に対して効率的なソリューションに適応させるにはどうすればよいですか(シングルチャンネル画像とRGB画像の両方に適用したい)