gpt4 book ai didi

python - Python中的2D卷积类似于Matlab的conv2

转载 作者:IT老高 更新时间:2023-10-28 21:18:07 32 4
gpt4 key购买 nike

我一直在尝试使用 SciPy 和 Numpy 对 2D 矩阵进行卷积,但失败了。对于我尝试过的 SciPy,sepfir2d 和 scipy.signal.convolve 以及用于 Numpy 的 Convolve2D。 Matlab for Python中是否有像conv2这样的简单函数?

这是一个例子:

 A= [ 5     4     5     4;
3 2 3 2;
5 4 5 4;
3 2 3 2 ]

我想用 [0.707 0.707]

进行卷积

Matlab 中 conv2 的结果是

3.5350    6.3630    6.3630    6.3630    2.8280
2.1210 3.5350 3.5350 3.5350 1.4140
3.5350 6.3630 6.3630 6.3630 2.8280
2.1210 3.5350 3.5350 3.5350 1.4140

用 Python 计算这个输出的一些函数?我将不胜感激。

最佳答案

scipy 有多种不同的方法,但 numpy 中不直接包含 2D 卷积。 (如果您需要避免 scipy 依赖,仅使用 numpy 的 fft 也很容易实现。)

scipy.signal.convolve2dscipy.signal.convolvescipy.signal.fftconvolvescipy.ndimage。 convolve 都会以不同的方式处理 2D 卷积(最后三个是 N-d)。

scipy.signal.fftconvolve 在 fft 域中进行卷积(这是一个简单的乘法)。这在许多情况下要快得多,但与离散情况相比,可能会导致边缘效应的差异非常小,并且您的数据将通过此特定实现强制转换为 float 。此外,在将小数组与大得多的数组进行卷积时,还会使用不必要的内存。总而言之,基于 fft 的方法可以显着加快,但在某些常见用例中 scipy.signal.fftconvolve 并不是理想的解决方案。

scipy.signal.convolve2dscipy.signal.convolvescipy.ndimage.convolve 都使用用 C 实现的离散卷积,但是,他们以不同的方式实现它。

scipy.ndimage.convolve 保持相同的数据类型,并让您控制输出的位置以最大限度地减少内存使用。如果您正在卷积 uint8(例如图像数据),它通常是最好的选择。输出将始终与第一个输入数组的形状相同,这对图像有意义,但可能不适用于更一般的卷积。 ndimage.convolve 让您可以通过 mode kwarg(其功能与 scipy.signal 完全不同)来控制边缘效果的处理方式s mode kwarg).

如果您使用二维数组,请避免使用 scipy.signal.convolve。它适用于 N-d 情况,但对于 2d 数组来说不是最理想的,并且存在 scipy.signal.convolve2d 可以更有效地完成完全相同的事情。 scipy.signal 中的卷积函数使您可以使用 mode kwarg 控制输出形状。 (默认情况下,它们的行为就像 matlab 的 conv2。)这对于一般的数学卷积很有用,但对图像处理的用处不大。但是,scipy.signal.convolve2d 通常比 scipy.ndimage.convolve 慢。

有很多不同的选项,部分原因是 scipy 的不同子模块中存在重复,部分原因是实现卷积的不同方法具有不同的性能权衡。

如果您能提供更多关于您的用例的详细信息,我们可以推荐一个更好的解决方案。如果您要卷积两个大小大致相同的数组,并且它们已经是 float ,那么 fftconvolve 是一个很好的选择。否则, scipy.ndimage.convolve 可能会击败它。

关于python - Python中的2D卷积类似于Matlab的conv2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16121269/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com