Matlab函数imfilter在Python中的对应

本文记录Matlab中的imfilter函数在Python下的对应函数,同时完美处理matlab卷积中对于边界的处理;文章引自ShuqiaoS博主,在此表示感谢,并加以验证和方法修改以及内容补充。

原文链接:https://blog.csdn.net/ShuqiaoS/article/details/110389141?spm=1001.2014.3001.5502

文章目录

首先给出结论:

Matlab Python
imfilter中的'conv' scipy.ndimage.convolve
imfilter中的'conv' scipy.ndimage.convolve
imfilter中的'corr' scipy.ndimage.correlate
imfilter中的'replicate'选项 上述函数中的mode='nearest'选项
n×n的核 相同的核
n×1的核 将数值放于n × n 的核的第n / 2 + 1 列(注意起始下标id=0),其余位置为0
1×n的核 将数值放于n × n 的核的第n / 2 行,其余位置为0

其中,可以用命令scipy.ndimage.filters.convolvescipy.ndimage.filters.correlate,也可以用scipy.ndimage.convolvescipy.ndimage.correlate,这两个命令是等价的

Conv

核尺寸为n×n时

下面的例子中,输入为:

核函数为:

Matlab命令:

python 复制代码
imfilter(img, kernel, 'conv', 'replicate')

对应Python命令:

python 复制代码
scipy.ndimage.filters.convolve(input, kernel, mode='nearest')

二者结果对比:

需要注意的是,上述命令中,Matlab下kernel的尺寸可以是列或行向量,但是Python下必须是一个n ∗ n 的矩阵,否则会报错。

核尺寸为n×1时

当核为列向量时,在Matlab中可以直接使用。比如当核为kernel = [1, 0, 1, 2, 1, 2, 3, 7, -1]时,Matlab命令:

python 复制代码
output_tmp = imfilter(tmp, kernel, 'conv', 'replicate');

的运行结果如下:

此时,如果想要得到相同的运算结果,则需要在Python下将值放置于中心位置,如下图所示:

此时,Python下的计算结果为:

与Matlab相同。

如果核尺寸为偶数,Python核有值的位置为n / 2 (Python中下标从0开始)。比如当n = 10 的时候,需要将第6列变成当前需要的数值(即对应Python下id=5)。例如,Matlab中核为kernel = [1, 0, 1, 2, 1, 2, 3, 7, -1, 1];,则Python下的核需要写成:

同样用命令

python 复制代码
output_tmp = imfilter(tmp, kernel, 'conv', 'replicate')  % Matlab命令
scipy.ndimage.filters.convolve(input, kernel, mode='nearest')  # Python命令

得到如下结果:

核尺寸为1×n时

当核为行向量时,在Matlab中可以直接使用,Python核有值的位置为n / 2 行。比如当核为kernel = [1, 0, 1, 2, 1, 2, 3, 7, -1]时,Matlab命令:

output_tmp = imfilter(tmp, kernel, 'conv', 'replicate')

的计算结果如下:

如果想得到同等对应的Python结果,则需要将核变成:

Python下的结果为

对于n 为偶数的情况也是相同的。如,Matlab下的核为kernel = [1, 0, 1, 2, 1, 2, 3, 7, -1, 1]时,命令

python 复制代码
output_tmp = imfilter(tmp, kernel, 'conv', 'replicate')

的结果为:

此时对应的Python核为:

结果为:

Corr

核尺寸为n×1时和核尺寸为1×n时的对应关系与前文Conv中所述相同,这里不再赘述。

下面的例子中,输入为:

核函数为:

Matlab命令:

python 复制代码
imfilter(img, kernel, 'corr', 'replicate')

对应Python命令:

python 复制代码
scipy.ndimage.filters.correlate(input, kernel, mode='nearest')


Conv2

虽然conv2在python中非常类似的替代函数convolve2d,但测试发现效果不好,会存在值不匹配问题,整体值上移一层,造成错误。

比如:

matlab代码:

python 复制代码
sstnum = conv2(sstnan,kernel,'same');

matlab结果为:

但使用python代码convolve2d方法:

python 复制代码
sstnum = convolve2d(sstnan1, kernel, mode='same', boundary='fill', fillvalue=0)

python结果为:

可以发现python的结果明显比matlab结果多了第一行,所以这种方法不可取。

推荐使用方法为:

python 复制代码
sstnum = convolve(sstnan1, np.rot90(kernel, 2), mode='constant', cval=0.0)

仍然使用卷积的方法,此时python结果为:

相关推荐
malog_2 分钟前
PyTorch图像数据加载实战指南
图像处理·人工智能·pytorch·python
博.闻广见2 分钟前
AI_Python基础-4.标准库与IO
开发语言·python
程序猿编码2 分钟前
大模型的“文字障眼法“:FlipAttack 文本反转越狱技术全解析
linux·python·ai·大模型
吃好睡好便好3 分钟前
在Matlab中绘制质点运动轨迹图
开发语言·学习·算法·matlab·信息可视化
晚烛8 分钟前
CANN 数据流与内存优化:L1/L2 缓存机制与计算重叠深度解析
人工智能·python·缓存
xiao5kou4chang6kai48 分钟前
如何用Python处理气象海洋数据?台风数据爬取、SST的EOF分析、WRF剖面图绘制
python·气象·台风·wrf·海洋
Reload.9 分钟前
CZ航司,shopping JS逆向 acw_sc__v2
开发语言·javascript·python·网络爬虫·ecmascript
码界筑梦坊9 分钟前
130-基于Python的体育用品销售数据可视化分析系统
开发语言·python·信息可视化·flask·毕业设计
码界筑梦坊11 分钟前
131-基于Flask的美国新泽西州自动售货机销售数据可视化分析系统
开发语言·python·信息可视化·数据分析·flask·毕业设计
子榆.12 分钟前
CANN PyTorch适配器深度拆解:从.cuda()到.npu()到底发生了什么
人工智能·pytorch·python