【问题标题】:matlab: splitting images into overlapping blocksmatlab:将图像分割成重叠块
【发布时间】:2014-04-11 20:10:23
【问题描述】:

我有一个大小为[M,N] 的图像,我想将其拆分为大小为[rr,cc]overlapping 块。每个块移动yyxx 像素。下面的代码完成了这项工作。有没有更有效的方法来做到这一点?例如避免for 循环?我发现approach #1approach #2 的解决方案主要针对non-overlapping 块。

SOL 1

Im = imread('cameraman.tif');
[M,N,~] = size(Im);
rr = 64; cc = 64; xx = 32; yy = 32;

numBlocksYY = numel(1:rr-xx:(M-(rr-1)));
numBlocksXX = numel(1:cc-yy:(N-(cc-1)));
[numBlocksYY, numBlocksXX]
C = cell(numBlocksYY*numBlocksXX,1);
counter = 1;
for ii=1:rr-xx:(M-(rr-1))
    for jj=1:cc-yy:(N-(cc-1))
        fprintf('[%d:%d, %d:%d]\n',ii,ii+rr-1,jj,jj+cc-1);
        C{counter} =  Im(ii:(ii+rr-1), jj:(jj+cc-1), : );
        counter = counter + 1;
    end
    fprintf('\n');
end

figure;
for ii=1:numBlocksYY*numBlocksXX
    subplot(numBlocksYY,numBlocksYY,ii), imagesc( C{ii} ); axis image; colormap gray;
end

SOL 2 受此post 中提出的一些解决方案的启发,我尝试使用ndgrid 找到解决方案,但是我以后如何填写输出cell C 并使用XX 访问子图像和YY 索引?我也很想知道是否还有其他解决方案:-)?

[YY,XX]=ndgrid( 1:(rr-xx):(M-(rr-1)) , 1:(cc-yy):(N-(cc-1)));

【问题讨论】:

标签: matlab image-processing matrix overlap


【解决方案1】:

您可以从SOL 2中给出的XXYY获取输出cell C,如下所示:

% indices of the first rr x cc block
IDX1 = bsxfun(@plus, (1:rr)', ((1:cc)-1)*M);
% offset in indices for each block
offset = (XX(:)-1) + (YY(:)-1)*M;
% indices of each block, the block is indexed with the 3rd dimension
IDX = bsxfun(@plus, IDX1, reshape(offset, [1 1 numel(offset)]));
% convert to cell of blocks
C = mat2cell(Im(IDX), rr, cc, ones(1, numel(XX)));

【讨论】:

  • 如何将这个出色的解决方案扩展到多通道图像(例如 RGB)?
猜你喜欢
  • 1970-01-01
  • 2013-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-16
  • 2017-05-24
相关资源
最近更新 更多