MATLAB 中 3-D 卷积中滤波器的维数

Dimension of Filter in 3-D Convolution in MATLAB

matlab中数组A和B进行N维卷积的函数如下所示:

C = convn(A,B) % returns the N-dimensional convolution of arrays A and B.

我对使用高斯滤波器的 3-D 卷积很感兴趣。 如果 A 是一个 3 x 5 x 6 矩阵,那么 B 的维数必须是多少?

B的维度可以是任何你想要的。在尺寸方面没有固定限制。对于高斯滤波器,它可以是 1D、2D 或 3D。在 1D 中,将发生的是每一行都被独立过滤。在 2D 中,会发生的是每个 slice 都被独立过滤。最后,在 3D 中,您将执行 3D 卷积中预期的操作。我假设您想要完整的 3D 卷积,而不仅仅是 1D 或 2D。

您可能对 convn 的输出大小感兴趣。如果您参考文档,给定两个 N 维矩阵,对于输出的每个维度 k 并且如果 nak 是矩阵的维度 k 的大小 Anbk是矩阵B的维度k的大小,输出矩阵Cnck的维度大小是这样的:

nck = max([nak + nbk - 1, nak, nbk])

nak + nbk - 1 直接来自卷积理论。维度的最终输出大小只是维度 k 中两个大小的总和减去 1。但是如果这个值小于 naknbk,我们需要确保输出大小兼容,以便任何输入矩阵都能适合最终输出。这就是为什么您拥有最终输出大小并受 AB 限制的原因。

为了使这更容易,您可以根据分布的标准偏差设置过滤器的大小。我想向您介绍我之前的 Stack Overflow post: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 NN = 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 约束的矩阵值,但由于零填充,边框元素将被归零。