2011-09-02 19 views
5

私はblockprocが好きです。大きな(非常に大きい)画像で簡単に作業できます。しかし、私が理解する限り、が入力と同じサイズのマトリックスを出力する関数での作業に限られています。セル配列出力のためのBlockprocのような機能

blockprocが何を複製するかシミュレートする方法があるのですが、がセル配列を出力する関数であるかどうか疑問に思っていました。我々は、処理関数からの出力配列が入力行列の同じ次元であると仮定するか、ただ一つのセル要素を出力すると仮定することができます。この場合、総処理からの最終出力はM x N要素のセル配列、 MNと処理のためのタイリングを指定する。

cellfunを使用して自分自身で作成することができると思いますが、これに使用できる他の組み込み関数やライブラリ(サードパーティの可能性もあります)があるかどうかは不思議でした。

具体的には、私はblockprocと同じ強みを持っているものを探しています:

  • する処理
  • のメモリフットプリントを最小限にするために、ディスク次第に、タイルから大きな画像を読み込むことができます(等タイルの例えば#)blockprocと同様のインターフェースを持ち、最終的なセルアレイ
  • を構築するために結果の最終的な連結の世話を
+0

セル配列に「複雑な」データが含まれているので、['cell2mat']に関数をラップすることはできません(http://www.mathworks.de/help/techdoc/ref/cell2mat.html)。 ) 'blockproc'を使う? –

+0

そうです@ジョナスです。私は処理を行う関数(例えば、型、その内容など)から出力セルについて何も仮定しない解決策を探しています –

答えて

2

以下は、最初の点を除いて、基準を満たすソリューションです

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) 
+0

ありがとう!これはとても役に立ちます。 –

0

私はヌメ革でも、似た何かをやってきましたセルよりむしろric値。

このような何かが動作するはずです:

I = imread('pout.tif'); 

G = blockproc(I, [8 8], @(b) shiftdim(imhist(b.data)', -1), 'PadPartialBlocks', true); 

G = reshape(G, size(G, 1) * size(G, 2), size(G, 3)); 

pout.tifはグレースケール画像であるが、私は、これはRGB用に変更することができると確信しています。

また、shiftdimを使用するときは注意してください。imhistは行ベクトルを返して、それを列に転記します。

関連する問題