博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python conv2d scipy卷积运算
阅读量:5830 次
发布时间:2019-06-18

本文共 2143 字,大约阅读时间需要 7 分钟。

scipy的signal模块经常用于信号处理,卷积、傅里叶变换、各种滤波、差值算法等。 

*两个一维信号卷积

>>> import numpy as np>>> x=np.array([1,2,3])>>> h=np.array([4,5,6])>>> import scipy.signal>>> scipy.signal.convolve(x,h) #卷积运算array([ 4, 13, 28, 27, 18])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

卷积运算大致可以分成3步,首先先翻转,让两个信号列反过来,如上面就是1,2,3和6,5,4。然后作平移,6,5,4最开始在1,2,3的左边,没有重叠,现在向右移动,4和1就重叠了。对于重叠的部分,作乘积求和。也就是1x4得到第一个结果1,然后再移动后5x1+4x2得到第二个结果13以此类推。 

卷积运算可以用来做大整数的乘法(数组表示数的乘法),比如在上面的例子中,要求123乘以456,可以先得到它的卷积序列,然后从后往前,18将8保留,进位1给27;然后27变成28,把8保留进位2给28;然后28变成30,把0保留进位3给13;然后13变成16,把6保留进位1给4;4变成5即是最高位。也就是乘法的结果是56088。

*对白噪声卷积

>>> import numpy as np>>> from scipy import signal>>> import matplotlib.pyplot as plt>>> sig=np.random.randn(1000) #生成随机数>>> autocorr=signal.fftconvolve(sig,sig[::-1],mode='full') #fft算法实现卷积>>> fig,(ax_orig,ax_mag)=plt.subplots(2,1) #建立两行一列图形>>> ax_orig.plot(sig) #在第一行把原始的随机数序列sig画出来[
]>>> ax_orig.set_title('White noise') #设置标题'白噪声'
>>> ax_mag.plot(np.arange(-len(sig)+1,len(sig)),autocorr) #卷积后的图像[
]>>> ax_mag.set_title('Autocorrelation') #设置标题
>>> fig.tight_layout() #此句可以防止图像重叠>>> fig.show() #显示图像
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

fftconvolve只是用fft算法(快速傅立叶变换)实现的卷积,其结果应当和普通的convolve一样。

*二维图像卷积运算

>>> import numpy as np>>> from scipy import signal>>> from scipy import misc>>> import matplotlib.pyplot as plt>>> face=misc.face(gray=True) #创建一个灰度图像>>> scharr=np.array([[-3-3j,0-10j,+3-3j],        [-10+0j,0+0j,+10+0j],         [-3+3j,0+10j,+3+3j]]) #设置一个特殊的卷积和>>> grad=signal.convolve2d(face,scharr,boundary='symm',mode='same') #把图像的face数组和设计好的卷积和作二维卷积运算,设计边界处理方式为symm>>> fig,(ax1,ax2)=plt.subplots(1,2,figsize=(10,6)) #建立1行2列的图fig>>> ax1.imshow(face,cmap='gray') #显示原始的图
>>> ax1.set_axis_off() #不显示坐标轴>>> ax2.imshow(np.absolute(grad),cmap='gray') #显示卷积后的图
>>> ax2.set_axis_off() #不显示坐标轴>>> fig.show() #显示绘制好的画布
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

二维的卷积需要用上面的signal.convolve2d()。 

之所以要对卷积后的图像数组grad作np.absolute()求绝对值运算是因为灰度图像的值都是正值,没有负的,为了防止出现负值所以才这样做。 
 
二维的卷积运算还有一种函数,是signal.sepfir2d(),它可以传入三个参数,后两个参数指定行和列的卷积和(两个方向上的卷积是可以不同的,分别指定卷积和序列)。

转载于:https://www.cnblogs.com/hdk1993/p/8784605.html

你可能感兴趣的文章
eclipse集成weblogic开发环境的搭建
查看>>
写一个bat文件,删除文件名符合特定规则,且更改日期在某
查看>>
【jc2-1】 网络层IP编址
查看>>
我的友情链接
查看>>
apahce安装时的APR问题解决方法
查看>>
Citrix今年9月份就会出XenServer的新版本
查看>>
MySQL数据库高并发优化配置
查看>>
写Use Case的一种方式,从oracle的tutorial抄来的
查看>>
【C#】protected 变量类型
查看>>
Shell下支持变量的重复字符串
查看>>
Ubuntu解压
查看>>
爬虫_房多多(设置随机数反爬)
查看>>
藏地密码
查看>>
爬虫去重(只是讲了去重的策略,没有具体讲实现过程,反正就是云里雾里)...
查看>>
react中将px转化为rem或者vw
查看>>
8816
查看>>
受检查异常要求try catch,new对象时,就会在堆中创建内存空间,创建的空间包括各个成员变量类型所占用的内存空间...
查看>>
oracle线程数更改
查看>>
TP框架设置的LOG_LEVEL不起作用
查看>>
为什么你的电脑会变得越来越慢?
查看>>