2011-10-31 88 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));