我正在嘗試爲一個任務寫一個非本地平均值過濾器。我用兩種方法編寫了代碼,但我期望更快的方法比其他方法慢得多。在MATLAB中的非本地平均值過濾器優化
方法1:(此方法比較慢)
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
方法2:(此方法速度更快)
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會爲矩陣運算進行優化。它有沒有理由不在這個代碼中?差別非常大。對於512x512
形象,h = 0.05
,外循環的一次迭代需要24-28
秒的方法1和10-12
秒的方法2
第二種方法中的「h」是什麼? –
'h'是非局部均值濾波參數。對於這兩種方法,'h = 0.05'。 – shashwat