2011-10-31 26 views
1

我的matlab腳本中出現了性能問題。圖像識別 - 性能問題

我想要做的是找到一條水平線,沿着它的強度值的變化是最小的。天真的執行如下。問題是如何重寫它以提高性能。

% img is some previously loaded image 
height = size(img,1); 
width = size(img,2); 

smallestVar = inf; 
smallestXline = []; 
smallestYline = []; 

for i=1:height, 
    for j=1:width, 
     for k=i+1:height, 
      xline = [j j]; 
      yline = [i k]; 
      variance = var(improfile(img,xline,yline)); 
      if variance < smallestVar 
       smallestVar = variance; 
       smallestXline = xline; 
       smallestYline = yline; 
      end 
     end 
    end 
end 
+1

您可以絕對矢量化大量此代碼。我會首先分析它:http://www.mathworks.com/help/techdoc/ref/profile.html。內置的MATLAB分析器非常好,可以幫助您開始使用。但是,如果可能,MATLAB代碼應該始終是矢量化的。見Maurits post。 – linuxuser27

回答

2

如果它僅僅是一個水平線上,即矩陣的所有行,你可以做到這一點:

sigma = var(matrix, 0, 2); 
[val, idx] = sort(sigma, 'ascend'); 

val(1)將包含最小方差和idx(1)相應行索引。如果您正在尋找任何直線進行掃描,請查看所謂的「跟蹤轉換」。

1

這是一個更快的方法(基於你對問題的描述)。變量行將具有最小方差的行號:

[~, row] = min(var(img, 0, 2));