【发布时间】: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.05 的512x512 图像,外部循环的一次迭代对于方法1 需要24-28 秒,对于方法2 需要10-12 秒。
【问题讨论】:
-
第二种方法中的
h是什么? -
h是非局部均值过滤参数。对于这两种方法,h=0.05.
标签: matlab image-processing octave