我正在尝试在Matlab中实现3D高斯滤波器 - 没有使用内置的Matlab过滤功能,如 imfilter , imgaussfilt 等......
我有一个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
中犯了一些错误。
答案 0 :(得分:1)
请勿使用conv
,因为这是针对1D信号的。使用convn
进行N维过滤,您可以在其中指定任何维度的内核,包括3D。
因此,它只是一个问题:
FilteredData = convn(RAW, GaussM);
另请注意,默认操作是提供执行完整卷积的输出,这意味着输出的大小将大于RAW
的原始大小。要确保convn
的输出与RAW
的大小相同,请将'same'
标记指定为convn
的第三个参数:
FilteredData = convn(RAW, GaussM, 'same');