我喜欢blockproc,它可以轻松地处理大(非常大)的图像.但是,据我所知,它仅限于使用输出与其输入相同大小的矩阵的函数.  
所以我想知道是否有一种方法可以复制/模拟输出单元阵列的blockproc函数.我们可以假设处理函数的输出数组与输入矩阵的维度相同,或者它只输出一个单元格元素,在这种情况下,总处理的最终输出将是带元素的单元格数组,并指定处理的平铺.M x NMN
我相信我可以自己构建这个cellfun,但我想知道是否有任何其他内置或库(可能是第三方?)我可以用于此,甚至可以完全避免重新发明轮子.
更具体地说,我正在寻找具有以下优势的东西blockproc:
blockproc(例如瓷砖等)除了第一点之外,以下是满足您标准的解决方案
使用 IM2COL 函数将图像中的不同图像块排列成列,然后将函数应用到每列,将结果存储在元胞数组中。
当然,这只有在所有块都适合内存的情况下才有效,否则您必须手动编写代码一次提取一个块并以这种方式处理它......
%# read image
img = im2double(imread('tire.tif'));
%# blocks params
sizBlk = [8 8];
numBlk = ceil( size(img) ./ sizBlk );
%# extract blocks
B = im2col(img, sizBlk, 'distinct');
B = reshape(B, [sizBlk size(B,2)]);    %# put blocks on the 3rd dimension
B = squeeze( num2cell(B,[1 2]) );      %# convert to cell array
B = reshape(B, numBlk);                %# reshape as blocks overlayed on image
%# process blocks
myFcn = @(blk) [mean2(blk) std2(blk)]; %# or any other processing function
I = cellfun(myFcn, B, 'UniformOutput',false);
%# in this example, we can show each component separately
subplot(121), imshow( cellfun(@(c)c(1),I) ), title('mean')
subplot(122), imshow( cellfun(@(c)c(2),I) ), title('std')
Run Code Online (Sandbox Code Playgroud)
或者,您仍然可以使用 BLOCKPROC 函数,但必须多次调用它,每次计算一个功能:
%# compute one feature at a time
b1 = blockproc(img, sizBlk, @(b)mean2(b.data), 'PadPartialBlocks',true);
b2 = blockproc(img, sizBlk, @(b)std2(b.data), 'PadPartialBlocks',true);
%# combine into cellarray of features
II = arrayfun(@(varargin)[varargin{:}], b1, b2, 'UniformOutput',false);
%# compare to previous results
isequal(I,II)
Run Code Online (Sandbox Code Playgroud)