Python中与Matlab imfilter等效的函数

11 投票
4 回答
15675 浏览
提问于 2025-04-17 20:35

我知道MATLAB中的conv2corr2函数在Python中对应的是scipy.signal.correlatescipy.signal.convolve。不过,MATLAB的imfilter函数有一个特点,就是它可以处理数组边界之外的情况,比如symmetric(对称)、replicate(复制)和circular(循环)。那么,Python能做到这些吗?

4 个回答

0

之前提到的选项对我来说没有像MATLAB的imfilter那样好用,所以我用了cv2.filter2D。代码如下:

import cv2

filtered_image = cv2.filter2D(image, -1, kernel)

原始图像是:

这里放图像描述

用MATLAB的imfilter处理后的效果是:

这里放图像描述

scipy.ndimage.convolvescipy.ndimage.correlate处理后的效果是:

这里放图像描述

而用cv2.filter2D处理后的效果是:

这里放图像描述

因为我从MATLAB保存的图像和用cv2保存的图像看起来不完全一样,但相信我,它们实际上是一样的。

1

我需要在Python中实现和Matlab中一样的高斯滤波效果,于是我写出了以下代码:

Matlab代码:

A = imfilter(A, fspecial('gaussian',12,3));

Python代码:

A = scipy.ndimage.correlate(A, matlab_style_gauss2D((12,12),3), mode='constant', origin=-1)

其中,matlab_style_gauss2D的代码可以从这个链接获取:如何在Python中获得高斯滤波器

8

我想分享一些实用的代码,关于在Python中实现和MATLAB中imfilter(A, B)相同的功能,适用于简单的二维图像和滤波器(内核)。我发现下面的代码能得到和MATLAB一样的结果:

import scipy.ndimage
import numpy as np
scipy.ndimage.correlate(A, B, mode='constant').transpose()

对于这个问题,这段代码可以正常工作:

scipy.ndimage.correlate(A, B, mode='nearest').transpose()

需要注意的是,出于某种原因,MATLAB返回的结果是我们预期答案的转置。

想了解更多选项,可以查看文档 这里

编辑 1:

MATLAB提供了更多选项,具体可以在文档中查看 这里。特别是,如果我们想使用'conv'选项,MATLAB的代码示例如下:

imfilter(x, f, 'replicate', 'conv')

在Python中,这段代码的对应写法是:

scipy.ndimage.convolve(x, f, mode='nearest')

注意,MATLAB中的'replicate'和Python中的'nearest'是相同的。

3

使用函数 scipy.ndimage.filters.correlatescipy.ndimage.filters.convolve

撰写回答