2

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

4

1 回答 1

2

使用 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上。

于 2013-10-09T23:04:58.450 回答