如何加速这种for-loop?

时间:2011-06-24 15:00:46

标签: performance matlab for-loop max vectorization

我想计算沿给定轴方向的最大翻译图像。我知道ordfilt2,但我想避免使用图像处理工具箱。

所以这是我到目前为止的代码:

imInput = imread('tire.tif');
n = 10;

imMax = imInput(:, n:end);
for i = 1:(n-1)
    imMax = max(imMax, imInput(:, i:end-(n-i)));
end

是否可以避免使用for循环来加速计算,如果是这样,怎么办?


首次修改:使用Octave的im2col代码实际上要慢50%。

第二次修改:预分配似乎不足以改善结果。

sz = [size(imInput,1), size(imInput,2)-n+1];

range_j = 1:size(imInput, 2)-sz(2)+1;
range_i = 1:size(imInput, 1)-sz(1)+1;

B = zeros(prod(sz), length(range_j)*length(range_i));

counter = 0;
for j = range_j % left to right
    for i = range_i % up to bottom
        counter = counter + 1;
        v = imInput(i:i+sz(1)-1, j:j+sz(2)-1);
        B(:, counter) = v(:);            
    end
end

imMax = reshape(max(B, [], 2), sz);

第三次修改:我将展示时间。

2 个答案:

答案 0 :(得分:3)

对于它的价值,这是使用图像处理工具箱中的IM2COL函数的矢量化解决方案:

imInput = imread('tire.tif');
n = 10;

sz = [size(imInput,1) size(imInput,2)-n+1];
imMax = reshape(max(im2col(imInput, sz, 'sliding'),[],2), sz);
imshow(imMax)

screenshot

您可以编写自己的IM2COL版本,因为它只包含精心设计的索引,甚至可以查看Octave implements的方式。

答案 1 :(得分:2)

查看关于在c中进行滚动中位数的这个问题的答案。我已经成功地将它变成了mex函数,它比ordfilt2更快。最大限度地完成需要做一些工作,但我确信这是可能的。

Rolling median in C - Turlach implementation