B 的尺寸可以是任何你想要的。在大小方面没有固定的限制。对于高斯滤波器,它可以是 1D、2D 或 3D。在 1D 中,将发生的情况是每一行都被独立过滤。在 2D 中,每个 slice 都会被独立过滤。最后,在 3D 中,您将执行 3D 卷积中预期的操作。我假设您想要一个完整的 3D 卷积,而不仅仅是 1D 或 2D。
您可能对convn 的输出大小感兴趣。如果您参考文档,给定两个N 维度矩阵,对于输出的每个维度k,如果nak 是矩阵A 的维度k 的大小@ 和nbk 是矩阵B的维度k的大小,输出矩阵C或nck的维度大小是这样的:
nck = max([nak + nbk - 1, nak, nbk])
nak + nbk - 1 直接来自卷积理论。一个维度的最终输出大小只是维度k 中两个大小的总和减去1。但是如果这个值小于nak 或nbk 中的任何一个,我们需要确保输出大小是兼容的,因此任何输入矩阵都可以适合最终输出。这就是为什么您拥有最终输出大小并受A 和B 限制的原因。
为了使这更容易,您可以根据分布的标准差设置过滤器的大小。我想向您推荐我之前的 Stack Overflow 帖子:By which measures should I set the size of my Gaussian filter in MATLAB?
这决定了应该给高斯滤波器的输出大小一个标准差。
在 2D 中,过滤器的尺寸为 N x N,因此 N = ceil(6*sigma + 1) 与 sigma 是所需的标准偏差。因此,您将分配一个大小为 N x N x N 和 N = ceil(6*sigma + 1); 的 3D 矩阵。
因此,您要用于创建 3D 高斯过滤器的代码如下所示:
% Example input
A = rand(3, 5, 6);
sigma = 0.5; % Example
% Find size of Gaussian filter
N = ceil(6*sigma + 1);
% Define grid of centered coordinates of size N x N x N
[X, Y, Z] = meshgrid(-N/2 : N/2);
% Compute Gaussian filter - note normalization step
B = exp(-(X.^2 + Y.^2 + Z.^2) / (2.0*sigma^2));
B = B / sum(B(:));
% Convolve
C = convn(A, B);
最后一点是,如果您提供的过滤器的任何尺寸超出输入矩阵 A 的大小,您将使用每个 nck 值的约束得到一个矩阵,但边界由于零填充,元素将被归零。