【问题标题】:Is there a more efficient way to to divide my image into overlapping blocks?有没有更有效的方法将我的图像分成重叠的块?
【发布时间】:2015-03-18 19:20:44
【问题描述】:

我想将我的图像划分为重叠的块并单独处理这些块并将每个矩阵的输出存储到一个矩阵中。

我尝试过使用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

这样做有两个问题,第一,没有办法控制块的重叠。

第二个过程非常缓慢并且非常非常耗内存。在第三张图片上我的电脑基本上内存不足,即使我clear之前的图片也是如此。

有没有什么有效的方法可以将我的图像分成重叠的块?

附:我无法为每个图像创建一个 for 图像,因为每个图像的大小都不同:(

【问题讨论】:

  • 看看Efficient Implementation of im2col and col2im 是否有帮助。另外,您正在处理什么尺寸的图像?基本上,带有im2col 的邻域矩阵本身就很大,因此在本地执行特征提取然后保存比创建邻域矩阵然后进行特征提取处理更有意义。
  • @Divakar 谢谢,但你链接的问题是im2col 的实现,我已经有图像处理工具箱,如果我要使用该功能,我将如何控制@ 987654330@重叠窗口?我同意你的看法,这是非常低效的。但我试图在这里找到替代品。 blockproc 在这里是理想的,但问题在于blockproc 的输出,这个问题准确地解释了我的问题:stackoverflow.com/questions/29109241/…

标签: image matlab image-processing


【解决方案1】:

接下来列出的是一种实现im2col 的方法以及额外的overlapping 功能。它建立在Efficient Implementation ofim2colandcol2im` 上的另一个 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

【讨论】:

  • 谢谢,太好了。我会应用它,看看效果如何
  • @ipunished 我也有兴趣了解此代码对您的数据的效率!
猜你喜欢
  • 2012-03-02
  • 1970-01-01
  • 2022-12-21
  • 1970-01-01
  • 1970-01-01
  • 2014-04-11
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多