2017-11-24 15 views
0

私は任意の寸法の画像を持っていますROWSCOLS。私はこの画像を任意の、しかし一定のストライド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画像の両方に適用したい)

答えて

0

上記のコードは完全には機能しませんでしたので、私はそれに基づいて以下の解決策を考え出しました。変数名は、それらが自明であるように選択される。

tilesCountR = floor((ROWS - rowBlockSize - 1)/rowStride + 1); 
tilesCountC = floor((COLS - colBlockSize - 1)/colStride + 1); 

tiles = cell(tilesCountR * tilesCountC,1); 
tileidx = 1; 
for col = 1 : colStride : COLS - colBlockSize 
    for row = 1 : rowStride : ROWS - rowBlockSize 
     tiles{tileidx} = img(row:row+rowBlockSize-1, col:col+colBlockSize-1, :); 
     tileidx = tileidx + 1; 
    end 
end