2011-09-02 72 views
5

我喜歡blockproc,它可以輕鬆處理大(很大)的圖像。不過,據我瞭解,它僅限於使用輸出與輸入大小相同的矩陣的函數。用於單元陣列輸出的Blockproc-like函數

所以我想知道是否有複製/模擬blockproc做什麼的方式,但對於輸出單元陣列的功能。我們可以假定來自處理函數的輸出數組具有與輸入矩陣相同的尺寸,或者它只輸出一個單元元素,在這種情況下,總處理的最終輸出將是具有M x N元素的單元陣列,與MN指定處理的平鋪。

我相信我可以使用cellfun自己構建這個,但我想知道是否有其他的內置函數庫或庫(可能是第三方?),我可以使用它,甚至可以完全避免重新發明輪子。

更具體地說,我要找的東西,具有相同的強項blockproc

  • 可以從磁盤加載一個大的圖像逐漸瓷磚接一個區塊,以儘量減少處理的內存佔用
  • 照顧結果的最後級聯的用於構建最終單元陣列
  • 具有類似於blockproc的接口(例如瓷磚#等)
+0

我認爲你的單元格數組包含「複雜」的數據,所以你不能把你的函數包裝到['cell2mat']中(http://www.mathworks.de/help/techdoc/ref/cell2mat.html )並使用'blockproc'? –

+0

這就對了@Jonas。我正在尋找一種解決方案,它不會對處理函數(例如類型,內容等)的輸出單元格做出任何假設 –

回答

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

我一直在做類似的事情,雖然nume價值而不是細胞。

像這樣的東西應該工作:

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返回一個行向量,所以我將它轉置爲列。