以下は、最初の点を除いて、基準を満たすソリューションです
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)
セル配列に「複雑な」データが含まれているので、['cell2mat']に関数をラップすることはできません(http://www.mathworks.de/help/techdoc/ref/cell2mat.html)。 ) 'blockproc'を使う? –
そうです@ジョナスです。私は処理を行う関数(例えば、型、その内容など)から出力セルについて何も仮定しない解決策を探しています –