【问题标题】:Non Local Means Filter Optimization in MATLABMATLAB 中的非局部均值滤波器优化
【发布时间】:2014-02-20 08:31:40
【问题描述】:

我正在尝试为作业编写一个非本地均值过滤器。我用两种方式编写了代码,但我希望更快的方法比另一种方法慢得多。

方法一:(这个方法比较慢)

for i = 1:size(I,1)
    tic
    sprintf('%d/%d',i,size(I,1))
    for j = 1:size(I,2)
        w = exp((-abs(I-I(i,j))^2)/(h^2));

        Z = sum(sum(w));
        w = w/Z;

        sumV = w .* I;

        NL(i,j) = sum(sum(sumV));
    end
    toc
end

方法二:(这个方法比较快)

for i = 1:size(I,1)
    tic
    sprintf('%d/%d',i,size(I,1))
    for j = 1:size(I,2)
        Z = 0;
        for k = 1:size(I,1)
            for l = 1:size(I,2)
                w = exp((-abs(I(i,j)-I(k,l))^2)/(h^2));

                Z = Z + w;
            end
        end

        sumV = 0;
        for k = 1:size(I,1)
            for l = 1:size(I,2)
                w = exp((-abs(I(i,j)-I(k,l))^2)/(h^2));
                w = w/Z;

                sumV = sumV + w * I(k,l);
            end
        end

        NL(i,j) = sumV;
    end
    toc
end

我真的认为 MATLAB 会针对矩阵运算进行优化。有没有理由不在此代码中?差异相当大。对于带有h = 0.05512x512 图像,外部循环的一次迭代对于方法1 需要24-28 秒,对于方法2 需要10-12 秒。

【问题讨论】:

  • 第二种方法中的h是什么?
  • h 是非局部均值过滤参数。对于这两种方法,h=0.05.

标签: matlab image-processing octave


【解决方案1】:

我的猜测是你没有预先分配NL,这两种方法都在同一个函数中(或者是脚本并且你没有在函数运行之间清除NL)。这会大大减慢第一种方法的速度。

尝试以下方法:为这两种方法创建一个函数。每个方法运行一次。然后使用profiler 查看每个函数大部分时间都花在了哪里。

【讨论】:

  • 它们是独立的函数,而不是脚本。在这两种情况下,我都将 NL 初始化为 zeros。我会尝试profiler 并回复您。
【解决方案2】:

这两种方法做的不是同一件事。在方法 2 中,w= 表达式中的术语 abs(I(i,j)-I(k,l)) 被平方,这很好,因为该术语只是单个数值。

但是,在方法 1 中,术语 abs(I-I(i,j)) 实际上是一个矩阵(从矩阵 I 中的每个元素中减去数值 I(i,j),再次返回一个矩阵)。因此,当该术语与 ^ 运算符平方时,就会发生矩阵乘法。根据方法 2,我的猜测是这不是您想要的。相反,如果您想对该矩阵中的每个元素求平方,则使用.^ 运算符,如abs(I-I(i,j)).^2

矩阵乘法是一种计算密集度更高的运算,这可能是方法 1 耗时更长的原因。

【讨论】:

  • 哦!谢谢!我确实打算执行逐项乘法。 .^ 将运行时间减少到 2-3 秒!
【解决方案3】:

使用im2col 可以实现更快的实现(矢量化):

  1. 从每个邻域中创建一个向量。
  2. 使用预定义的索引计算每个补丁之间的距离。
  3. 使用sum 函数对值和权重求和。

这个方法完全不用循环。

【讨论】:

    猜你喜欢
    • 2015-11-06
    • 2015-07-12
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    相关资源
    最近更新 更多