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

标签 python image matlab signal-processing convolution

我一直在尝试使用 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/

相关文章:

python - 操作数无法与形状 (16,) (21,) -pandas 一起广播

c++ - 如何为 OpenCV 多核图像处理创建 TBB 任务调度程序? C++

Java - 如何在不裁剪的情况下填充图像并调整图像大小?

matlab - 排列矩阵行内的元素

java - 防止 MATLAB 更改 Java 外观

python - 返回负数的数字列表

python - 在 matplotlib 中使用科学计数法时定位刻度标签的指数

python - FileNotFoundError : [Errno 2] No such file or directory: '/kaggle/input/CORD-19-research-challenge/comm_use_subset/comm_use_subset/pdf_json' in kaggle

javascript - react 使用 img onerror

matlab - 在 Matlab 时间序列数据中查找阈值交叉,然后在找到下一个阈值交叉之前忽略后续交叉 60 秒