如何在 MATLAB 中以(恒定)任意步幅将图像平铺成(恒定)任意大小的补丁?
Posted
技术标签:
【中文标题】如何在 MATLAB 中以(恒定)任意步幅将图像平铺成(恒定)任意大小的补丁?【英文标题】:How can I tile an image into patches of (constant) arbitrary size at (constant) arbitrary stride in MATLAB? 【发布时间】:2017-11-24 13:34:43 【问题描述】:我有一张任意尺寸的图像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)
tilestileidx = img(row:row+stride(1)-1, col:col+stride(2)-1, :);
tileidx = tileidx + 1;
end
end
但是,它似乎也只有在没有多余的行或列时才有效。对于具有任意数量通道的图像(我试图将其应用于单通道图像和 RGB 图像),我如何使其适应有效的解决方案?
【问题讨论】:
【参考方案1】:上面的代码并没有完全发挥作用,所以我基于它想出了下面的解决方案。选择变量名称时,它们是不言自明的。
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
tilestileidx = img(row:row+rowBlockSize-1, col:col+colBlockSize-1, :);
tileidx = tileidx + 1;
end
end
【讨论】:
以上是关于如何在 MATLAB 中以(恒定)任意步幅将图像平铺成(恒定)任意大小的补丁?的主要内容,如果未能解决你的问题,请参考以下文章