我有一张任意尺寸ROWS
和COLS
的图像。我希望将此图像平铺为任意但恒定大小blockSize = [blockSizeR, blockSizeC]
的块,给定任意但恒定的步幅stride = [strideR, strideC]
。当行或列方向上的补丁数量相应的块大小分别不等于行数或列数时(即,如果有备用行或列),我不关心它们(即他们可以被忽略)。如果图像被平铺成从左上角像素开始完全适合图像的所有可能的补丁,那就足够了。
网络上有许多可能的解决方案,但有些解决方案不允许重叠,如果有备用行或列,有些解决方案不允许输出,有些解决方案使用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图像)?