2014-01-10 132 views
2

我正在實現(對於類,因此沒有內置!)Hough變換的變體來檢測圖像中的圓。我有一個工作產品,我得到正確的結果。換句話說,我完成了任務!但是,我想進一步嘗試改善性能。另外,爲了防止任何不可避免的反應,我知道MATLAB並不是最基於性能的語言,我知道霍夫變換也不完全是基於性能的,但是請聽我說。當生成霍夫積累空間時,我最終需要繪製大量的圓(對於圖像中的每個邊緣像素約75個;對於每個搜索半徑一個)。我寫了一個漂亮的函數來做到這一點,它已經相當優化。然而,我最終重新計算了不同位置(便宜)的同一半徑(昂貴)的許多圓圈。在MATLAB函數中實現運行時常量持久「LUT」

對我來說,優化這個方法的一個簡單方法是預先計算一個以零爲中心的每個半徑的圓圈,然後選擇正確的圓圈並將其移到正確的位置。這很簡單,而且效果很棒!

試圖訪問此查找表的圈子時遇到了麻煩。

我最初做了它持久的變量,如下所示:

[x_subs, y_subs] = get_circle_indices(circ_radius, circ_x_center, circ_y_center) 

    persistent circle_lookup_table; 

    % Make sure the table's already been generated; if not, generate it. 
    if (isempty(circle_lookup_table)) 
     circle_lookup_table = generate_circles(100); %upper bound circ size 
    end 

    % Get the right circle from the struct, and center it at the requested center 
    x_subs = circle_lookup_table(circ_radius).x_coords + circ_x_center; 
    y_subs = circle_lookup_table(circ_radius).y_coords + circ_y_center; 

end 

然而,事實證明這是慢! 超過200,000個函數調用,MATLAB平均每次調用9微秒來建立持久變量存在! (不是isEmpty()調用,而是實際的變量聲明)。這是根據MATLAB的內置分析器。

這增加了從實施查找表獲得的大部分時間。我也嘗試過將它作爲一個全局變量(類似的時間來檢查變量是否被聲明)或作爲變量傳遞它(使函數調用更加昂貴)。

所以,我的問題是這樣的:

如何提供一個函數內快速訪問運行時,恆定的數據?

我期待着一些建議。

回答

1

它不是運行時常數數據,因爲你的函數有能力生成表。所以你的主要問題是放棄這個函數的指令。在此關鍵函數的所有調用之前,請確保此數組在函數外部的其他位置生成。

但是,我從Matlab的文件中讀到了一個很好的技巧,更具體地說是bwmorph。對於需要LUT的這個特殊函數的每個功能,他們創建了一個返回LUT本身的函數(LUT明確寫入文件中)。他們還添加一條指令coder.inline('always')以確保此功能將被內聯。這似乎很有效率!

+0

感謝您的迴應!你正在使用什麼版本的MATLAB?在我的(學生執照)R2012a中,我無法在我的bwmorph副本中找到這個例子! 此外,它聽起來像他們將不得不在每次函數調用時重新生成LUT - 我希望相同的LUT在每次函數調用時都保持不變而不被重新生成。 – Glenn

+0

@Glenn你有圖像處理工具箱嗎?如果在命令窗口中鍵入'bwmorph',則可以訪問文件本身,然後選擇它並按下'Ctrl + D'。在文件中,有趣的函數是'images.internal.algbwmorph'。再次按下'Ctrl + D',你就在調用luts的文件中,所以你可以選擇:) – Bentoy13

+0

@Glenn關於LUT的生成,我認爲由於內聯指令,LUT可能不是每次都會重新生成...但我沒有找到任何證據。 – Bentoy13