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
的大小 A
和nbk
是矩阵B
的维度k
的大小,输出矩阵C
或nck
的维度大小是这样的:
nck = max([nak + nbk - 1, nak, nbk])
nak + nbk - 1
直接来自卷积理论。维度的最终输出大小只是维度 k
中两个大小的总和减去 1。但是如果这个值小于 nak
或 nbk
,我们需要确保输出大小兼容,以便任何输入矩阵都能适合最终输出。这就是为什么您拥有最终输出大小并受 A
和 B
限制的原因。
为了使这更容易,您可以根据分布的标准偏差设置过滤器的大小。我想向您介绍我之前的 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 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
约束的矩阵值,但由于零填充,边框元素将被归零。
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
的大小 A
和nbk
是矩阵B
的维度k
的大小,输出矩阵C
或nck
的维度大小是这样的:
nck = max([nak + nbk - 1, nak, nbk])
nak + nbk - 1
直接来自卷积理论。维度的最终输出大小只是维度 k
中两个大小的总和减去 1。但是如果这个值小于 nak
或 nbk
,我们需要确保输出大小兼容,以便任何输入矩阵都能适合最终输出。这就是为什么您拥有最终输出大小并受 A
和 B
限制的原因。
为了使这更容易,您可以根据分布的标准偏差设置过滤器的大小。我想向您介绍我之前的 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 N
且 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
约束的矩阵值,但由于零填充,边框元素将被归零。