我正在使用一个有很长循环的Matlab程序,在这个循环中是以下代码:
...
H = fspecial('gaussian', 6*sig(i), sig(i));
img_out = imfilter(img{i},H,'same');
...
其中'sig'是高斯宽度列表,'img'是图像的单元格数组。
我需要让这段代码更有效率,也许这两点可以让你更聪明:
答案 0 :(得分:1)
我找到了一个很好的解决方案: http://blog.ivank.net/fastest-gaussian-blur.html
Matlab帮助文件中有一个快速实现:
intImage = integralImage(I);
avgH = integralKernel([1 1 7 7], 1/49);
J = integralFilter(intImage, avgH);
所以3次传球应该接近高斯!
答案 1 :(得分:0)
我尝试批量处理相同大小和sigma的图像,将它们堆叠起来:
%problem generator
%real number is 10^6
num_of_images=10^4;
%i assume squared images
image_size=randi([60,100],num_of_images,1);
sig=randi([2,4],num_of_images,1);
img=cell(num_of_images,1);
ratio_nnz=.02;
for idx=1:num_of_images
ti=rand(image_size(idx))/ratio_nnz;
ti(ti>1)=0;
img{idx}=ti;
end
%existing approac
tic;
for idx=1:num_of_images
H = fspecial('gaussian', 6*sig(idx), sig(idx));
img_out = imfilter(img{idx},H,'same');
end
toc;
%idea: Match images of same sigma and
tic
%calculate all filters offline
[sig_unique,~,sig_index]=unique(sig);
H=cell(numel(sig_unique),1);
for idx=1:numel(sig_unique)
H{idx}= fspecial('gaussian', 6*sig_unique(idx), sig_unique(idx));
end
%find instances of same size and sigma
[x,y]=cellfun(@size,img);
[a,b,c]=unique([sig_index,x,y],'rows');
img_out=cell(size(img));
for didx=1:numel(b)
%img{c==didx} contains images of same sigma and size, process them at
%once
iH=H{a(didx,1)};
timg=cat(3,img{c==didx});
timg_out=imfilter(timg,iH,'same');
img_out(c==didx)=num2cell(timg_out,[1,2]);
end
toc
结果让我感到惊讶,实际上用较少但较大的矩阵调用imfilter
对我生成的数据来说速度较慢。不过,请尝试使用您的数据和/或计划实施的更快的高斯滤波器。它可能会更快。