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]) |
卷积运算大致可以分成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') |
| >>> fig,(ax_orig,ax_mag)=plt.subplots(2,1) |
| >>> ax_orig.plot(sig) |
| [<matplotlib.lines.Line2D object at 0x0000000006E1DC88>] |
| >>> ax_orig.set_title('White noise') |
| <matplotlib.text.Text object at 0x0000000006931860> |
| >>> ax_mag.plot(np.arange(-len(sig)+1,len(sig)),autocorr) |
| [<matplotlib.lines.Line2D object at 0x0000000006E1DB00>] |
| >>> ax_mag.set_title('Autocorrelation') |
| <matplotlib.text.Text object at 0x0000000006DFE8D0> |
| >>> fig.tight_layout() |
| >>> fig.show() |
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') |
| >>> fig,(ax1,ax2)=plt.subplots(1,2,figsize=(10,6)) |
| >>> ax1.imshow(face,cmap='gray') |
| <matplotlib.image.AxesImage object at 0x00000000078FC198> |
| >>> ax1.set_axis_off() |
| >>> ax2.imshow(np.absolute(grad),cmap='gray') |
| <matplotlib.image.AxesImage object at 0x00000000078FCE48> |
| >>> 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(),它可以传入三个参数,后两个参数指定行和列的卷积和(两个方向上的卷积是可以不同的,分别指定卷积和序列)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架