Python中matlab imfilter的等效函数

Posted

技术标签:

【中文标题】Python中matlab imfilter的等效函数【英文标题】:The equivalent function of Matlab imfilter in Python 【发布时间】:2014-04-04 05:48:10 【问题描述】:

我知道MATLAB的conv2corr2的等效函数是scipy.signal.correlatescipy.signal.convolve。但是函数imfilter 具有处理数组边界之外的属性。比如symmetricreplicatecircular。 Python 能做到这些吗

【问题讨论】:

【参考方案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 可以取自How to obtain a gaussian filter in python

【讨论】:

【参考方案2】:

对我来说,之前的选项与 MATLAB 的 imfilter 的工作方式不同,而是我使用了 cv2.filter2D。代码是:

import cv2

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

原图是:

使用 MATLAB 的imfilter

使用scipy.ndimage.convolvescipy.ndimage.correlate

还有cv2.filter2D

由于我从 MATLAB 和 cv2 保存图像的方式,它们在这里看起来并不完全相同,但相信我,它们是。

【讨论】:

【参考方案3】:

只是为了添加一些可靠的代码,我希望 imfilter(A, B) 在 python 中等效于简单的二维图像和过滤器(内核)。我发现以下结果与 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 会返回预期答案的转置。

有关更多选项,请参阅文档 here。

编辑 1:

MATLAB 提供了更多选项,如 here 所述。具体来说,如果我们希望使用 'conv' 选项,我们有 MATLAB 代码(例如):

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

这与 python 等价:

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

注意 MATLAB 中的 'replicate' 与 Python 中 SciPy 中的 'nearest' 相同。

【讨论】:

【参考方案4】:

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

【讨论】:

您能详细说明一下吗?我正在尝试完全复制profil2 = imfilter(profil,h,'replicate');

以上是关于Python中matlab imfilter的等效函数的主要内容,如果未能解决你的问题,请参考以下文章

我可以在 matlab 中使用 imfilter 计算两个图像之间的相关性吗?

matlAB中gv=imfilter(I2,sv,'replicate')是啥意思

python中Matlab的等效命令'end'是啥? [复制]

matlab中是不是有等效的python函数id()?

实际比较filter2D和imfilter之间的关系

MATLAB中用imfilter()对图像进行相关或卷积运算前一定要用tofloat()或im2double()将数据类型转换为浮点型