【发布时间】:2014-04-11 20:10:23
【问题描述】:
我有一个大小为[M,N] 的图像,我想将其拆分为大小为[rr,cc] 的overlapping 块。每个块移动yy 和xx 像素。下面的代码完成了这项工作。有没有更有效的方法来做到这一点?例如避免for 循环?我发现approach #1 或approach #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)));
【问题讨论】:
-
尝试过 BLOCKPROC? mathworks.in/help/images/ref/blockproc.html
-
@Divakar,谢谢,但我只是想稍后将这些子图像保存到磁盘中,即我不想将任何
function应用到块中 ;-)
标签: matlab image-processing matrix overlap