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. 用企业微信实现预警(shell + python)

    目录 一 注册企业微信 注册企业微信必备条件 注册 二 创建消息 创建部门 邀请成员加入 创建应用 关注微工作平台 三 实现预警 通过shell 脚本实现监控预警 通过python 脚本实现监控预警 ...

  2. docker 创建tomcat镜像

    Dockerfile ############################################ # version : wenbronk/jdkiu121/tomcat8 # desc ...

  3. 01 JDBC的问题

    jdbc编程步骤: 1. 加载.注册数据库驱动   DriverManager 2. 创建并获取数据库链接   Connection 3. 创建jdbc statement/preparedState ...

  4. Hive use mapreduce引擎 bsonFile splits报错处理

    Hive use mapreduce引擎 1.          出现报错.关于bsonFile的.禁止hdfs里面存储的bson文件自动splits. 可以在hive-site.xml文件里面添加如 ...

  5. SpringBoot 初接触之 404

    1. 确认输入项目路径是否正确,如:http://localhost:8080/index,这里需要注意的是端口号的查看 2. 确认注解是否用对 在 Controller 层类上面使用的注解是 @Re ...

  6. [转]Using TRY...CATCH in Transact-SQL

    本文转自:https://technet.microsoft.com/en-us/library/ms179296(v=sql.105).aspx Using TRY...CATCH in Trans ...

  7. Oracle超过连接数(ORA-12520)

    原因是超过了连接数,最有效的处理方法是关闭em服务,停止em服务,改成禁用. show parameter processes;  --查看允许连接情况 select count(*) from v$ ...

  8. RegExp正则表达式——更深层次解析

    转自:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RegExp RegExp 构造 ...

  9. Kafka、RabbitMQ、RocketMQ消息中间件的对比

    引言 分布式系统中,我们广泛运用消息中间件进行系统间的数据交换,便于异步解耦.现在开源的消息中间件有很多,目前对Kafka.RabbitMQ.RocketMQ这三个消息中间件做下对比分析. - - k ...

  10. Java Swing实战(三)文本组件JTextField和密码组件JPasswordField

    接下来添加文本组件JTextField和密码组件JPasswordField. /** * @author: lishuai * @date: 2018/11/26 13:51 */ public c ...