MATLAB filter2 和 conv2 函数说明

  在 MATLAB 中,filter2 函数实现二维数字滤波器.conv2 函数实现二维卷积.

  filter2(H, X, mode) 等价于 conv2(X, rot90(H,2), mode). 其中,H 表示有理传递函数的系数(Coefficients of rational transfer function),即常说的滤波器核或卷积核.X 表示输入数据.mode 表示卷积或滤波所采用的模式,其决定了返回数据的长度,以及结果数据的不同部分.共有三种模式:'full', 'same', 'valid',具体含义详见 filter2 函数的shape 参数文档说明,或查看我的博文相关与卷积(数字信号处理)的数学原理及 Python 实现 的原理部分.

  注:MATLAB 中,B = rot90(A, k) 将数组 A 逆时针旋转 k*90 度,其中 k 为整数.

Python 中的等价函数

  在 Python 中,MATLAB filter2 的等价函数是scipy.signal.correlate2d;MATLAB conv2 的等价函数是 scipy.signal.convolve2d

  具体来说,filter2(H, X, mode) 等价于 scipy.signal.correlate2d(X, H, mode)conv2(X, H, mode) 等价于 scipy.signal.convolve2d(X, H, mode)

  注意,filter2(MATLAB) 与 scipy.signal.correlate2d的输入参数 H, X 的顺序是不一致的.

  如果二维滤波或卷积结果采用常用的 'same' 模式,还可以使用 Python 中的 cv2.filter2D (OpenCV模块), scipy.ndimage.correlate 和 scipy.ndimage.convolve 替代.对于二维滤波('same'模式)的具体用法为

  cv2.filter2D(X, -1, H, borderType=cv2.BORDER_CONSTANT)
  scipy.ndimage.correlate(X, H, mode='constant', cval=0.0)
  scipy.ndimage.convolve(X, np.rot90(H,2), mode='constant', cval=0.0)

示例

MATLAB 代码

X = [  ];  % input data
H = [ ]; % kernel % display filter2() results
disp('filter2 results');
fprintf('full: '); disp(filter2(H, X, 'full'));
fprintf('same: '); disp(filter2(H, X, 'same'));
fprintf('valid: '); disp(filter2(H, X, 'valid'));
fprintf('\n'); % display conv2() results
disp('conv2 results');
fprintf('full: '); disp(conv2(H, X, 'full'));
fprintf('same: '); disp(conv2(H, X, 'same'));
fprintf('valid: '); disp(conv2(H, X, 'valid'));
fprintf('\n');

Python 代码

import numpy as np
import scipy.ndimage
import scipy.signal
import cv2 X = np.array([1, 2, 3]).reshape(1,3) # input data
H = np.array([4, 5, 6]).reshape(1,3) # kernel # display scipy.signal.correlate2 results
print ("scipy.signal.correlate2d results")
print ("full: {}".format(scipy.signal.correlate2d(X, H, 'full')))
print ("same: {}".format(scipy.signal.correlate2d(X, H, 'same')))
print ("valid: {}".format(scipy.signal.correlate2d(X, H, 'valid'))) print ('')
# display scipy.signal.convolve2 results
print ("scipy.signal.convolve2d results")
print ("full: {}".format(scipy.signal.convolve2d(X, H, 'full')))
print ("same: {}".format(scipy.signal.convolve2d(X, H, 'same')))
print ("valid: {}".format(scipy.signal.convolve2d(X, H, 'valid'))) # others
print ("\nother filters in Python ('same' mode)")
print ("cv2.filter2D: {}".format(cv2.filter2D(X.astype('float32'), -1, H, borderType=cv2.BORDER_CONSTANT)))
print ("scipy.ndimage.correlate: {}".format(scipy.ndimage.correlate(X, H, mode='constant', cval=0.0)))
print ("scipy.ndimage.convolve: {}".format(scipy.ndimage.convolve(X, np.rot90(H,2), mode='constant', cval=0.0)))

注:cv2.filter2DOpenCV 3.4.0 中,不支持整数类型的输入数据,需要先转为浮点型如 'float32' 等,才能正确执行.

参考资料

1. Equivalent of Matlab filter2(filter, image, 'valid') in python. https://stackoverflow.com/questions/43270274/equivalent-of-matlab-filter2filter-image-valid-in-python

2. Equivalent function of matlabs filter2 in opencv.  https://stackoverflow.com/questions/29212944/equivalent-function-of-matlabs-filter2-in-opencv

3. What is the difference between conv2, filter2 and imfilter..? https://www.mathworks.com/matlabcentral/answers/17529-what-is-the-difference-between-conv2-filter2-and-imfilter

MATLAB filter2/conv2 函数在 Python 语言中的等价函数的更多相关文章

  1. Python语言中各种进制相互转换

    目录 Python语言中各种进制相互转换 将二进制.八进制.十进制的数分别转换成十进制的方法 将十进制转换成二进制.八进制.十六进制 Python语言中各种进制相互转换 本文参考自https://ww ...

  2. js课程 3-10 js中字符串函数数组函数和其它语言中对应函数的区别和联系是什么

    js课程 3-10  js中字符串函数数组函数和其它语言中对应函数的区别和联系是什么 一.总结 一句话总结:js中是对象点方法的形式,这些方法都是对象的方法,而在php.java中却不是这样. 1.j ...

  3. Python语言中的关键字(自己做的读书笔记)

    电脑配置:联想笔记本电脑 windows8系统 Python版本:2.7.8 本文章撰写时间:2015.1.1 作者:陈东陈 阅读说明: 1.本文都是先解释,后放图片: 2.文中斜体部分要么为需要输入 ...

  4. 了解 Python 语言中的时间处理

    python 语言对于时间的处理继承了 C语言的传统,时间值是以秒为单位的浮点数,记录的是从1970年1月1日零点到现在的秒数,这个秒数可以转换成我们日常可阅读形式的日期和时间:我们下面首先来看一下p ...

  5. python语言中的编码问题

    在编程的过程当中,常常会遇到莫名其妙的乱码问题.很多人选择出了问题直接在网上找答案,把别人的例子照搬过来,这是快速解决问题的一个好办法.然而,作为一个严谨求实的开发者,如果不从源头上彻底理解乱码产生的 ...

  6. python语言中的编码问题(续)

    上文提到了python开发中非常重要的两处设置. 一个是编解码器的默认设置defaultencoding >>> import sys >>> sys.getdef ...

  7. python语言中的函数装饰器

    装饰器 什么是装饰器? 装饰:给已有的对象(函数)添加新的功能 器:工具              在python中指具备某些功能的函数 装饰器:装饰器就是一个给其他函数增加功能的函数 一种设计原则: ...

  8. python语言中的数据类型之字典

    数据类型 字典类型dict 用途:记录多个值,列表是索引对应值,而字典是key对应值,其中key对value有描述性 定义方式:在{ }用逗号分隔开多个元素,每个元素都是key:value形式,其中k ...

  9. 理解 Python 语言中的 defaultdict

    众所周知,在Python中如果访问字典中不存在的键,会引发KeyError异常(JavaScript中如果对象中不存在某个属性,则返回undefined).但是有时候,字典中的每个键都存在默认值是非常 ...

随机推荐

  1. 由一段代码谈前端js优化和编码规范(一) 分类: JavaScript 2015-03-21 12:43 668人阅读 评论(1) 收藏

    这段代码是撸主刚毕业那会写的,主要是实现一个左侧的导航条的折叠功能.当时实现的比较简陋,每次在导航条增加新的项目的时候,都要手动去修改js代码中写死的索引...确实是比较恼火的,后来就修改了一下,能够 ...

  2. Java_单例模式

    主要介绍单例模式的一种写法.注意事项.作用.测试,以Java语言为例,下面代码是目前见过最好的写法: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ...

  3. 数据库学习---SQL基础(一)

     数据库学习---SQL基础(一) 数据库学习---SQL基础(二) 数据库学习---SQL基础(三) SQL(struct query language)结构化查询语言:一种专门与数据库通信的语言, ...

  4. Git的gitattributes文件详解

    转自:Git的gitattributes文件详解 Git的gitattributes文件是一个文本文件,文件中的一行定义一个路径的若干个属性. 1. gitattributes文件以行为单位设置一个路 ...

  5. Hive是什么

    Hive是什么1)Hive 是建立在Hadoop (HDFS/MR)上的用于管理和查询结果化/非结构化的数据仓库:2)一种可以存储.查询和分析存储在Hadoop 中的大规模数据的机制:3)Hive 定 ...

  6. javaScript中用eval()方法转换json对象

    var u = eval('('+user+')'); 1.对于服务器返回的JSON字符串,如果jQuery异步请求没做类型说明,或者以字符串方式接受,那么需要做一次对象化处理,方式不是太麻烦,就是将 ...

  7. mac上用ssh登录服务失败的排查方法

    ssh -vvv user@ip/ traceroute ip telnet ip 22 ping

  8. [PHP] 重回基础(date函数和strtotime函数)

    date():格式化一个本地时间或者日期,当前时间 2016年5月13日 15:19:49 使用函数date(),输出当前是月份中的第几天,参数:String类型 d 例如:echo date(&qu ...

  9. JSP基础知识点

    JSP(Java Server Page)是主要有Sun公司倡导的一种动态网页技术,利用JSP可以构建跨平台的动态网站 应用,JSP在服务器端带JSP容器的Web服务器中运行.JSP以Java语言为基 ...

  10. JSP学习笔记(4)-Javabean

    按照sun公司的定义,Javabean是一个可重复使用的软件组件,实际上Javabean是一种Java类,通过封装属性和方法成为具有某种功能或处理某个业务的对象,简称Bean,Javabean基于ja ...