Image 有没有更有效的方法将图像分割为重叠块?

Image 有没有更有效的方法将图像分割为重叠块?,image,matlab,image-processing,Image,Matlab,Image Processing,我想把我的图像分割成重叠的块,分别处理这些块,并将每个矩阵的输出存储到一个矩阵中 我尝试过使用im2col,但根本不实用。我的代码是: kek = im2col(images_m{1}, [64 64], 'sliding'); for i = 1: size(kek, 2) new = reshape(kek(:,i), [64 64]); %Extract features from the new block and save it in a concatenating

我想把我的图像分割成重叠的块,分别处理这些块,并将每个矩阵的输出存储到一个矩阵中

我尝试过使用
im2col
,但根本不实用。我的代码是:

kek = im2col(images_m{1}, [64 64], 'sliding');
for i = 1: size(kek, 2)
    new = reshape(kek(:,i), [64 64]);
    %Extract features from the new block and save it in a concatenating
    %matrix
end
这有两个问题,第一,无法控制块的重叠

第二,这个过程非常缓慢,而且非常需要内存。在第三张图像中,我的计算机内存基本上用完了,即使我清除了前面的图像

有没有有效的方法将我的图像分割成重叠的块


另外,我不能为每个图像创建一个for图像,因为每个图像的大小都不同:(

下面列出的是一种通过附加的
重叠
功能来实现的方法。它建立在上的另一个Stackoverflow答案之上。下面是实现方法-

function out = im2col_sliding_overlap(A,blocksize,overlap)

%// Get size of A for later usages
[M,N] = size(A);

%// Number of blocks to be formed along X-Y directions
num_blks_x = (M - overlap)/(blocksize(1)-overlap);
num_blks_y = (N - overlap)/(blocksize(2)-overlap);

%// Store blocksize as number of rows and columns information
nrows_blk = blocksize(1);
ncols_blk = blocksize(2);

%// Start indices for each block
start_ind = bsxfun(@plus,[0:num_blks_x-1]'*(nrows_blk-overlap)+1,...
                       [0:num_blks_y-1]*(ncols_blk - overlap)*M); %//'

%// Block offset indices
blkoffset_idx = bsxfun(@plus,[0:nrows_blk-1]',[0:ncols_blk-1]*M); %//'

%// Indices for all blocks
idx = bsxfun(@plus,blkoffset_idx(:),start_ind(:).');              %//'

%// Index into A to have the final output
out = A(idx);

return;

样本运行-

>> A
A =
    0.6293    0.3797    0.8972    0.4471    0.1332    0.7758
    0.0207    0.6994    0.8347    0.6550    0.7619    0.6992
    0.5167    0.0107    0.9401    0.4059    0.7560    0.3019
    0.9483    0.1728    0.0323    0.8118    0.5423    0.3186
    0.6692    0.7135    0.5497    0.5216    0.9695    0.3097
    0.8801    0.1210    0.0402    0.7342    0.1006    0.4542

>> out = im2col_sliding_overlap(A,[4 4],2) %// Blocksize=[4 4], Overlap =2
out =
    0.6293    0.5167    0.8972    0.9401
    0.0207    0.9483    0.8347    0.0323
    0.5167    0.6692    0.9401    0.5497
    0.9483    0.8801    0.0323    0.0402
    0.3797    0.0107    0.4471    0.4059
    0.6994    0.1728    0.6550    0.8118
    0.0107    0.7135    0.4059    0.5216
    0.1728    0.1210    0.8118    0.7342
    0.8972    0.9401    0.1332    0.7560
    0.8347    0.0323    0.7619    0.5423
    0.9401    0.5497    0.7560    0.9695
    0.0323    0.0402    0.5423    0.1006
    0.4471    0.4059    0.7758    0.3019
    0.6550    0.8118    0.6992    0.3186
    0.4059    0.5216    0.3019    0.3097
    0.8118    0.7342    0.3186    0.4542

看看它是否有用。另外,你正在处理的图像的大小是多少?基本上,im2col的邻域矩阵本身是巨大的,因此在本地执行特征提取然后保存比创建邻域矩阵然后处理特征提取更有意义。@Divakar谢谢你,但您链接到的问题是
im2col
的实现,我已经有了图像处理工具箱,而且如果我要使用该功能,我将如何控制
滑动
重叠窗口?我同意您的看法,这是非常低效的。但我正在尝试在这里找到替代方法。
blockproc
会吗e这里很理想,但问题在于
blockproc
的输出,这个问题准确地解释了我的问题:谢谢,太完美了。我将应用它,看看它是如何实现的goes@ipunished我也有兴趣了解一下这段代码对您的数据的效率!