Ниже приведено решение, которое удовлетворяет вашим критериям, за исключением первого пункта
Используйте функцию 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')
В качестве альтернативы, вы все равно можете использовать функцию 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)