在某些情况下,你能建议比imfilter更快的东西吗?

时间:2015-03-22 16:39:44

标签: matlab fft convolution

我正在使用一个有很长循环的Matlab程序,在这个循环中是以下代码:

...  
H = fspecial('gaussian', 6*sig(i), sig(i));
img_out = imfilter(img{i},H,'same');
...

其中'sig'是高斯宽度列表,'img'是图像的单元格数组。

我需要让这段代码更有效率,也许这两点可以让你更聪明:

  1. 滤镜总是高斯 - 只是不同的西格玛。
  2. 'img {i}'中的图像是灰度稀疏矩阵。

2 个答案:

答案 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对我生成的数据来说速度较慢。不过,请尝试使用您的数据和/或计划实施的更快的高斯滤波器。它可能会更快。