【问题标题】:Dimension of Filter in 3-D Convolution in MATLABMATLAB中3-D卷积中滤波器的维数
【发布时间】:2017-11-22 04:17:01
【问题描述】:

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

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

我对带有高斯滤波器的 3D 卷积感兴趣。 如果A3 x 5 x 6 矩阵,那么B 的维度必须是多少?

【问题讨论】:

  • 这取决于您的高斯标准偏差和所需的精度。 B 可能是一个 3D 矩阵,但这不是必需的。

标签: matlab filtering signal-processing gaussian convolution


【解决方案1】:

B 的尺寸可以是任何你想要的。在大小方面没有固定的限制。对于高斯滤波器,它可以是 1D、2D 或 3D。在 1D 中,将发生的情况是每一行都被独立过滤。在 2D 中,每个 slice 都会被独立过滤。最后,在 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 限制的原因。

为了使这更容易,您可以根据分布的标准差设置过滤器的大小。我想向您推荐我之前的 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 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 值的约束得到一个矩阵,但边界由于零填充,元素将被归零。

【讨论】:

  • @rayreng,感谢您的回复!我还有另一个问题:在创建过滤器时,我传递了一个 3*3 Sigma 矩阵,以识别每个维度的 sigma 值。在这种情况下,我如何确定整体过滤器大小,因为每种情况下的 sigma 值都不同?此外,矩阵A 我正在与B 进行卷积运算——其中一个是 900 * 500 * 1000 的行列——你的想法是什么?非常感谢您的反馈。
  • 好的,等式现在不同了。您为每个方向应用6*sigma + 1 以查找 3D 矩阵的大小。调用这些M,N,O 然后更改meshgrid 以便它接收两个额外的向量,每个维度一个。 [X,Y,Z] = meshgrid(-M/2:M/2,-N/2:N/2,-O/2:O/2) 其中M,N,O 是从上面找到的。之后,因为 sigma 在每个维度上不相等,所以使用这种形式的高斯:wikimedia.org/api/rest_v1/media/math/render/svg/…,但现在为第三个维度添加一个额外的总和。之后就可以正常卷积了。
  • 非常感谢@rayryeng!我现在正在运行卷积。这需要很长时间(您是否估计将 900*500*1000 大小的 A 与 5*6*7 进行卷积需要多长时间(这是我的过滤器最终的大小) . 我也很感谢您对创建过滤器的不同方法的反馈。我创建了一个过滤器Fmvnpdf,这是 matlab 中的多元正态分布函数。在这种情况下,F 是我最终会与之卷积的A. mvnpdf 和你创建高斯的方法有什么显着区别。
  • mvnpdf 很好,因为它不假设维度彼此独立,或者矩阵的非对角线不为零。我指定的假设非对角线为零。但是,您的数据非常大,我预计它会花费大量时间。您在该矩阵中有 4.5 亿个条目。我不能给你一个确切的时间,它需要多长时间,但预计需要很长时间。 也许您可以通过在频域中进行过滤来解决此问题,但转换输入数据所需的时间将是一个杀手。
猜你喜欢
  • 1970-01-01
  • 2014-12-06
  • 1970-01-01
  • 1970-01-01
  • 2019-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
相关资源
最近更新 更多