2016-12-05 134 views
1

我想实现在Matlab三维高斯滤波器 - WITHOUT使用像imfilterimgaussfilt等内置Matlab的过滤功能...3D高斯滤波在Matlab


我有3D数据

RAW(K,K,K) 

说,K = 100,和过滤器宽度为delta = 5本实施例中。

目前,我有:

Ggrid = -floor(delta/2):floor(delta/2); 
[X Y Z] = meshgrid(Ggrid, Ggrid, Ggrid); 

% Create Gaussian Mask 
GaussM = exp(-(X.^2 + Y.^2 + Z.^2)/(2*delta^2)); 

% Normalize so that total area (sum of all weights) is 1 
GaussM = GaussM/sum(GaussM(:)); 

这给了我维K+1 * K+1 * K+1的3D高斯核。 现在,得到过滤后的数据,我希望做一个像卷积:

FilteredData = conv(RAW,GaussM); 

,但有一个尺寸不匹配。有人能指出我要去哪里吗?我假设我在高斯蒙版GaussM中犯了一些错误。

回答

1

请勿使用conv,因为这是用于1D信号。使用convn进行N维过滤,您可以在其中指定任何维度的内核,包括3D。

因此,它只是一个事:

FilteredData = convn(RAW, GaussM); 

还注意到,默认操作是提供一种执行卷积,这意味着输出的规模将大于输出原始尺寸为RAW。为了确保convn输出是大小相同的RAW,指定'same'标志作为第三个参数为convn

FilteredData = convn(RAW, GaussM, 'same'); 
+0

然后还有别的东西,你没有做正确。 'convn'可以舒适地完成3D数据。请发布确切的错误。 – rayryeng

+1

Tnx @rayryeng。 'convn'做了N维的卷积。同样的标志保持与(K,K,K)维度的卷积。工作比我想象的要容易得多。 我没有使用'conv'和'convn'循环。不知道有一面我可以使用的旗帜。 – newbie