2013-06-25 24 views
0

我有以下問題。我必須在非常高維的圖像(182MP)中計算密集的SIFT興趣點。當我在完整的圖像中運行代碼時,Matlab總是突然關閉。所以我決定在圖像補丁中運行代碼。在matlab中有兩個輸出變量的集合

代碼

我試圖使用blocproc在Matlab調用執行緻密SIFT興趣點檢測這種方式的C++函數:

fun = @(block_struct) denseSIFT(block_struct.data, options); 
[dsift , infodsift] = blockproc(ndvi,[1000 1000],fun); 

其中dsift是SIFT描述符(矢量)和infodsift具有興趣點的信息,例如x和y座標。

問題

的問題是,blocproc只允許一個輸出,但我想兩個輸出。當我運行代碼時,matlab給出了以下錯誤。

Error using blockproc 
Too many output arguments. 

有我這樣做的方法嗎?

回答

1

對於「硬編碼」blockproc版本是否會有問題?

假設一下,如果您可以將您的圖像分爲N×M個更小的圖像,就可以循環圍繞如下:然後

bigImage = someFunction(); 
sz = size(bigImage); 
smallSize = sz ./ [N M]; 
dsift = cell(N,M); 
infodsift = cell(N,M); 
for ii = 1:N 
    for jj = 1:M 
    smallImage = bigImage((ii-1)*smallSize(1) + (1:smallSize(1)), (jj-1)*smallSize(2) + (1:smallSize(2)); 
    [dsift{ii,jj} infodsift{ii,jj}] = denseSIFT(smallImage, options); 
    end 
end 

結果將在兩個單元陣列。沒有真正的需要預先分配,但如果你這樣做會更整潔。如果單個矩陣的大小相同,則可以將其轉換爲單個大矩陣,其中

dsiftFull = cell2mat(dsift); 

幾乎是魔法。如果你的矩陣大小不同,這將不起作用 - 但是,如果它們是,我不確定你甚至不想把它們全部放在一個單獨的(除非你決定horzcat他們)。

如果你決定你想要的「所有colums作爲一個大矩陣」的列表,那麼你可以做

giantMatrix = [dsift{:}]; 

這將返回一個矩陣(在你的例子)128行,並作爲有許多專欄發現有「興趣點」。這是速記

giantMatrix = [dsift{1,1} dsift{2,1} dsift{3,1} ... dsift{N,M}]; 
+0

謝謝你的幫助,這可以工作。我的新問題是,dsift和infodsift是矩陣。我可以在此循環內使用vertcat將結果保留在兩個最終的矩陣中。那麼,如何初始化將在循環之前接收結果的兩個矩陣?如何刪除這些與所需值串聯的矩陣的初始值?你有什麼想法做到這一點?再次感謝。 – mad

+1

這些矩陣的維數是多少?它們有沒有像'smallImage'一樣的尺寸? – Floris

+0

我只知道矩陣行數,列數取決於算法找到的興趣點數。行數爲128行,數據行數爲5行。謝謝。 – mad