【问题标题】:excessive slowness for image processing (vectorization of nested for loops)图像处理速度过慢(嵌套 for 循环的矢量化)
【发布时间】:2012-11-21 14:50:27
【问题描述】:

我需要有关 Octave 图像处理方面的帮助。我正在尝试在某些图像上计算本地“滑动窗口”ssd。速度太慢了(嵌套的 for 循环加起来 88*120*41*41 次迭代),因此无法使用它。我使用的版本是 Windows7 64 位上的 3.6.2。 (corei5)

我正在启动以下 octave 脚本

http://pastebin.com/AjDJSX6e

在下面的图片上

http://picpaste.com/pattern1-90xYCNZB.bmp

有什么建议吗? 提前感谢您的关注

【问题讨论】:

    标签: image matlab image-processing octave vectorization


    【解决方案1】:

    在函数filter2ordfilt2blockproc 处循环(最后一个很可能是您将使用的。它在2.0.0 之前的包版本中称为blkproc)。我没有仔细看你的代码试图做什么,但如果这些循环真的是必要的,我会感到非常惊讶。你似乎只在不同的索引上做简单的算术。了解如何矢量化您的代码,您将看到巨大的改进。如果您能解释代码应该做什么,我们可能会提供更多帮助。

    另外,您不需要使用sum (sum (x)),您可以并且应该将它们替换为sum (x(:))。而且你也不需要使用sum (x.^2),你可以使用sumsq (x)。所以你的 4 个函数调用 sqrt (sum (sum (curDiff.^2))) 可以替换为 sumsq (curDiff(:))

    比较以下:

    octave> x = rand (5000, 5000);
    octave> t = cputime (); sqrt (sum (sum (x.^2))); cputime () - t
    ans =  0.25202
    octave> t = cputime (); sumsq (x(:));            cputime () - t
    ans =  0.060004
    

    它不仅更短且更易于阅读,而且速度也提高了 4 倍(在像您这样的巨大循环中会产生巨大的差异)。

    【讨论】:

      猜你喜欢
      • 2020-09-16
      • 2017-02-01
      • 1970-01-01
      • 2019-09-20
      • 2015-11-01
      • 1970-01-01
      • 2011-11-30
      • 2018-11-13
      • 2017-10-13
      相关资源
      最近更新 更多