过滤器的速度非常快

时间:2013-10-09 22:24:54

标签: matlab image-processing filtering

我正在研究一种算法,该算法需要过滤3D矩阵(非稀疏,512 ^ 3)才能找到边缘。 我只想在每个切片中找到边缘,所以我一直在做以下事情:

% 2D loop appaoch    
[x,y]=ndgrid(floor(-3*sigma):ceil(3*sigma),floor(-3*sigma):ceil(3*sigma));    
DGauss=-(x./(2*pi*sigma^4)).*exp(-(x.^2+y.^2)/(2*sigma^2));    
filteredVolume = zeros(size(vol))    
for n = 1:size(vol,3)      
    filteredVolume(:,:,n) = imfilter(vol(:,:,n),DGauss,'conv','symmetric');    
end

我也尝试通过在整个卷上调用imfilter来做同样的事情:

% 3D matrix approach    
filteredVolume = imfilter(vol,DGauss,'conv','symmetric');

我比较了这两种方法的性能,但循环版本明显更快(6.5秒到20秒)。 这种行为应该是预期的吗?如果是这样,为什么?

1 个答案:

答案 0 :(得分:1)

3D版本需要更长时间的原因是因为imfilter决定过滤器是不可分离的。函数imfilter>isSeparable说明如下:

function separable = isSeparable(a, h)

% check for filter separability only if the kernel has at least
% 289 elements [17x17] (non-double input) or 49 [7x7] (double input),
% both the image and the filter kernel are two-dimensional and the
% kernel is not a row or column vector, nor does it contain any NaNs of Infs

由于输入图像不是2D,因此函数返回false并完成2D过滤操作,而不是两个连续的1D过滤器,这些过滤器更快。

另外,imfilter没有受益于JIT编译器。所有的时间都花在编译函数images\private\imfilter_mex上。