【问题标题】:How to speed this kind of for-loop?如何加速这种for循环?
【发布时间】:2011-09-22 02:48:09
【问题描述】:

我想计算沿给定轴方向的翻译图像的最大值。我知道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);

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

【问题讨论】:

    标签: performance matlab for-loop max vectorization


    【解决方案1】:

    对于它的价值,这是一个使用图像处理工具箱中的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)
    

    您也许可以编写自己的 IM2COL 版本,因为它只包含精心设计的索引,甚至可以看看 Octave implements 它是如何实现的。

    【讨论】:

    • 谢谢,但它实际上慢了 50%。 :'(
    • @wok:我并不是说它可能是最好的实现......看看你发布的代码,矩阵B 的大小正在动态增加,如果它显然会变得更快你预先分配。
    • 在没有看到计时结果的情况下(我怀疑差异是否那么显着),我建议您然后坚持原来的 for 循环。毕竟,它确实具有空间需求最小的优势......
    • 预分配确实改善了结果,但没有那么多。我想一个mex文件将是要走的路。无论如何,感谢im2col,它应该很有用。
    【解决方案2】:

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

    Rolling median in C - Turlach implementation

    【讨论】:

      猜你喜欢
      • 2011-05-14
      • 2021-12-08
      • 1970-01-01
      • 2021-09-03
      • 1970-01-01
      • 2021-01-30
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多