我正在研究一种算法,该算法需要过滤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秒)。 这种行为应该是预期的吗?如果是这样,为什么?
答案 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
上。