Python SciPy信号处理:一维、白噪声与二维图像卷积详解
本文详解Python中SciPy库signal模块的卷积应用。涵盖一维信号卷积的手动推导与整数乘法原理,利用fftconvolve处理白噪声自相关,以及通过convolve2d和sepfir2d进行二维图像边缘检测与滤波。结合代码示例解析参数设置与结果处理,适用于信号分析与图像处理初学者。
SciPy信号处理模块概述
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]与[6, 5, 4]进行对应;接着进行平移操作,使翻转后的序列从左侧无重叠状态逐步向右移动,直至与原始序列产生重叠;最后计算重叠部分的乘积之和。例如,当4与1重叠时,乘积为1;继续移动使5与1、4与2重叠,计算结果为5×1+4×2=13,依此类推得出完整序列。
卷积运算还可用于大整数乘法,即将数字表示为数组进行卷积计算。以123乘以456为例,先计算卷积序列[4, 13, 28, 27, 18],随后从后往前处理进位:保留末位8,将1进位至27变为28,再保留8进位2至28变为30,保留0进位3至13变为16,保留6进位1至4变为5,最终得到结果56088。
白噪声信号的FFT卷积处理
针对白噪声信号的卷积处理。
>>> 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画出来
[<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') #把图像的face数组和设计好的卷积和作二维卷积运算,设计边界处理方式为symm
>>> fig,(ax1,ax2)=plt.subplots(1,2,figsize=(10,6)) #建立1行2列的图fig
>>> 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() #显示绘制好的画布
处理二维图像卷积时,需调用signal.convolve2d()函数。
对卷积后的图像数组grad执行np.absolute()求绝对值操作,旨在确保灰度图像数值均为正值,避免计算过程中出现负值干扰。
二维卷积还提供signal.sepfir2d()函数,该函数接收三个参数,其中后两个参数分别指定行和列方向的卷积核序列,允许在两个方向上应用不同的卷积规则。
以上内容涵盖了SciPy卷积运算的主要应用场景,希望能为相关学习提供有益参考。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









