在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
的大小,则输出矩阵C
或nck
的维度大小如下:
nck = max([nak + nbk - 1, nak, nbk])
nak + nbk - 1
直接来自卷积理论。 维度的最终输出大小只是维度k
中两个大小之和减去 1。 然而,如果这个值小于nak
或nbk
中的任何一个,我们需要确保输出大小是兼容的,以便任何输入矩阵都可以适应最终输出。 这就是为什么您拥有最终输出大小并受A
和B
的限制。
为了简化此操作,您可以设置由分布的标准差引导的过滤器大小。 我想向您推荐我之前的堆栈溢出帖子:我应该通过哪些措施来设置 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
值的约束获得一个矩阵,但随后边框元素将由于零填充而归零。