您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 数字信号处理-使用Python对图片进行FFT变换
图片数字化FFT处理以及应用摘要本文主要讲述了FFT在现代社会普及的技术原因、其本身的技术来源、目的以及通过Python科学编程语言,将图片进行二维傅立叶变换的处理一、理解FFT算法离散傅立叶变换DFT(DiscreteFourierTransform)是一种将有限长时域离散信号变换到频域的变换,但变换的结果却是对于时域离散信号频谱的等间隔采样,这样,序列经过DFT之后,频域函数也被离散化了,这使得数字信号处理可以在频域使用现代计算机进行快速处理,大大增加了数字信号处理的灵活性,适应了现代数字化发展的要求,与此同时,采用如何的算法尽可能缩短进行DFT变换所需要的时间成了问题的关键,随着技术的发展,多种快速离散傅立叶变换算法被提出,也就是FFT(FastFourierTransform)FFT(快速傅里叶变换)本身就是离散傅里叶变换(DiscreteFourierTransform)的快速算法,使算法复杂度由原本的O(N^2)变为O(NlogN),离散傅里叶变换DFT,如同更为人熟悉的连续傅里叶变换,有如下的正、逆定义形式正向(FFT)变换:πkn/N2i1-N0n)(X(k)enx(1-1)逆向(IFFT)变换:πkn/N2i1-N0k)(1x(n)ekXN(1-2)x(n)到X(k)的转化就是空域到频域的转换,这个转换有助于研究信号的功率谱,和使某些问题的计算更有效率。而FFT的出现,则是将这个效率提高了好几个数量级。FFT算法设计者所掌握的最重要手段之一,就是利用DFT过程中涉及到的的对称性。如果你能清晰地展示问题的某一部分与另一部分相关,那么你就只需计算子结果一次,从而节省了计算成本,在DFT中,该对称性即x(k)与x(N+k)之间的对称性,由上面所给出的DFT前向公式,我们可以得到x(N+k)的推导过程:n/NNkπ2i1-N0n)(k)X(N)(enxπn2iπkn/N2i1-N0n)(eenxπkn/N2i1-N0n)(enx对于所有的整数n,exp[i*2πn]=1。最后结果可知:x(k)=x(N+k)利用对称性,DFT的计算可以分为两部分。从DFT的定义得:πkn/N2i1-N0n)(X(k)enx1)/Nπk(2m2i1-N/20mπk2m/N2i1-N/20m)12()2(emxemxN/2)(1/πkm2i1-N/20mπk/22N/2)πkm/2i1-N/20m)12()2(emxeemxi(我们将单个DFT分成了看起来相似两个更小的DFT。一个奇,一个偶。目前为止,我们还没有节省计算开销,每一部分都包含(N/2)∗N的计算量,总的来说,就是N^2。技巧就是对每一部分利用对称性。因为k的范围是0≤kN,而n的范围是0≤nM≡N/2,从上面的对称性特点来看,我们只需对每个子问题作一半的计算量。O(N^2)变成了O(M^2)。但我们不是到这步就停下来,只要我们的小傅里叶变换是偶倍数,就可以再作分治,直到分解出来的子问题小到无法通过分治提高效率,接近极限时,这个递归是O(nlogn)级的。当N的取值趋向无穷大的时候,所省下来的计算量必然是非常惊人的,日常科学计算中,使用DFT计算通常是ms级别,但FFT则是us级别,这就意味着,使用FFT花销1s,如果使用传统DFT算法,则需要将近半个小时的时间,这简直是不可思议的效率浪费!二、图像FFT变换上面讲述的是从时域到频域的FFT变换,只有时间变量,也就是常说的一维FFT,同样的,在二维乃至多维空间中,同样存在FFT,对于图像的傅里叶变换就是一种二维FFT。二维FFT定义如下:10i10)(2),(l)F(k,NiNjjNljNkijejifπ(2-1)我们知道,在图像中,每一个像素点都存在两个变量,像素的坐标(X,Y)以及像素的颜色(通常使用RGB格式或者HSV格式),经过FFT得到图像的频谱,图像的频率是表征图像中灰度变化剧烈程度的指标,是灰度在平面空间上的梯度。图像的边缘部分是突变部分,变化较快,因此反应在频域上是高频分量;图像的噪声大部分情况下是高频部分;图像大部分平缓的灰度变化部分则为低频分量。也就是说,傅立叶变换提供另外一个角度来观察图像,可以将图像从灰度分布转化到频率分布上来观察图像的特征。三、图像FFT变换的实践和应用频域在图像处理中,就我所知的用途主要在两方面:图像压缩和图像去噪。本次实践使用Python科学编程语言实现FFT,对有噪声的图片进行处理,经过频域上的滤波后还原图像。需要使用的Python科学计算包有numpy、scipy、opencv以及matplotlibnumpy:提供结构化的数组序列,用于存储离散数字序列以及图片文件scipy:提供常用的信号与系统方面的处理方法opencv:提供图片文件的处理matplotlib:提供良好的图表制作以及交互使用到的专用函数:numpy.fft.fft2():二维傅立叶变换numpy.fft.ifft2():二维傅立叶逆变换numpy.fft.fftshift():将频谱对称轴从左上角移至中心numpy.abs()求取傅立叶变换的模用于图片显示scipy.signal.butter()巴特沃斯滤波器参数设计scipy.signal.filtfilt()根据所给滤波器参数进行滤波scipy.signal.freqz()根据所给参数获取滤波器频率响应曲线设计步骤:1.使用手机相机获取图片来源,根据本次课程要求,自拍一张以验明正身2.使用Python语言读入图片,为了简化设计,本次仅读入灰度图片(将每一个像素点的颜色维度缩小到一维),并进行FFT变换3.对图片进行加噪处理,再次进行FFT4.设计巴特沃斯低通滤波器,滤除掉频谱中的高频部分5.进行IFFT变换,还原图像6.查看频谱变化程序运行结果:可知,含有噪声的图片进过FFT后低通处理,成功滤除了图片中的高频含量(含有噪点处变化尖锐,成为高频分量)最终通过IFFT,成功将图像还原附1:巴特沃斯滤波器频率响应曲线附2:Python源代码#FFT.pyimportnumpyasnpimportcv2frommatplotlibimportpyplotasplt#中文字体设置frommatplotlib.font_managerimportFontPropertiesfont=FontProperties(fname=rc:\windows\fonts\simsun.ttc,size=14)#新宋体#滤波器设计fromscipyimportsignalb,a=signal.butter(3,0.08,'low')#加噪百分比percentage=0.02#图片读取img=cv2.imread(self.jpg,0)#图片FFT变换img_fft=np.fft.fft2(img)img_fft_abs=np.log(np.abs(np.fft.fftshift(img_fft)))#图片IFFT处理结果img_ifft=np.fft.ifft2(img_fft)#图片加噪fromsaltimportsaltimg_salt=salt(img,percentage)#图片加噪FFT变换img_salt_fft=np.fft.fft2(img_salt)img_salt_fft_abs=np.log(np.abs(np.fft.fftshift(img_salt_fft)))#加噪图片巴特沃斯滤波img_salt_butter=signal.filtfilt(b,a,img)#巴特沃斯滤波器处理后频谱img_salt_butter_fft=np.fft.fft2(img_salt_butter)img_salt_butter_fft_abs=np.log(np.abs(np.fft.fftshift(img_salt_butter_fft)))#IFFT处理后图像img_butter_ifft=np.fft.ifft2(img_salt_butter_fft).real#IFFT得到的图片频谱img_butter_ifft_fft=np.fft.fft2(img_butter_ifft)fig1=plt.figure(num='图像及其频谱')plt.subplot(2,4,1),plt.imshow(img,'gray'),plt.title('源图',fontproperties=font)plt.subplot(2,4,5),plt.imshow(img_fft_abs,'gray'),plt.title('源图频谱',fontproperties=font)plt.subplot(2,4,2),plt.imshow(img_salt,'gray'),plt.title('源图加噪',fontproperties=font)plt.subplot(2,4,6),plt.imshow(img_salt_fft_abs,'gray'),plt.title('源图加噪后频谱',fontproperties=font)plt.subplot(2,4,3),plt.imshow(img_salt_butter,'gray'),plt.title('巴特沃斯滤波器处理后图像',fontproperties=font)plt.subplot(2,4,7),plt.imshow(img_salt_butter_fft_abs,'gray'),plt.title('处理后图像频谱',fontproperties=font)plt.subplot(2,4,4),plt.imshow(img_butter_ifft,'gray'),plt.title('巴特沃斯处理后频谱IFFT',fontproperties=font)plt.subplot(2,4,8),plt.imshow(img_fft_abs,'gray'),plt.title('IFFT频谱',fontproperties=font)#滤波器曲线计算N=4000fromscipyimportsignalw,h=signal.freqz(b,a)t,y=signal.impulse((b,a),N=10000000)fig2=plt.figure(num='滤波器曲线',figsize=(8,6))#plt.subplot(2,1,1),plt.imshow(img,'gray'),plt.title('脉冲响应曲线',fontproperties=font)#plt.subplot(2,1,2),plt.imshow(img,'gray'),plt.title('频率响应曲线',fontproperties=font)plt.subplot(1,1,1)plt.title('频率响应曲线',fontproperties=font)plt.plot(w/2/np.pi,20*np.log10(abs(h)),'b')plt.ylabel('幅度[dB]',color='b',fontproperties=font)plt.xlabel('Frequency[rad/sample]')#plt.subplot(2,1,2)#plt.plot(t,y)#angles=np.unwrap(np.angle(h))#plt.plot(w,angles,'g')#plt.ylabel('Angle(radians)',color='g')plt.grid()plt.axis('tight')plt.show()#salt.pyimportcv2importnumpyasnp#frommatplotlibimportpyplotaspltfrommatplotlibimportpyplotasplt#中文字体设置frommatplotlib.font_managerimpo
本文标题:数字信号处理-使用Python对图片进行FFT变换
链接地址:https://www.777doc.com/doc-4914514 .html