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 中,将发生的情况是每个切片都被独立过滤。 最后,在 3D 中,您将执行 3D 卷积中预期的事情。 我假设你想要一个完整的3D卷积,而不仅仅是1D或2D。

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

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

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

为了简化此操作,您可以设置由分布的标准差引导的过滤器大小。 我想向您推荐我之前的堆栈溢出帖子:我应该通过哪些措施来设置 MATLAB 中高斯滤波器的大小?

这决定了高斯滤波器的输出尺寸应具有标准偏差。

在2D中,滤波器的尺寸是N x N的,因此N = ceil(6*sigma + 1)sigma是所需的标准偏差。 因此,您将分配大小为N x N x N的 3D 矩阵,其中包含N = ceil(6*sigma + 1);

因此,要用于创建 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值的约束获得一个矩阵,但随后边框元素将由于零填充而归零。

最新更新