当前位置: 首页 > 后端技术 > Python

Python图像处理:频域滤波降噪图像增强

时间:2023-03-26 17:05:41 Python

图像处理已经成为我们日常生活中不可或缺的一部分,涉及社交媒体、医学影像等各个领域。从数码相机或其他来源(如卫星照片和医学扫描)获得的图像可能需要进行预处理以消除或增强噪声。频域滤波是一种可行的解决方案,可以在增强图像锐化的同时去除噪声。快速傅里叶变换(FFT)是一种将图像从空间域变换到频域的数学技术,是图像处理中进行频率变换的关键工具。通过利用图像的频域表示,我们可以根据图像的频率内容有效地分析图像,从而简化了消除噪声的滤波程序的应用。本文将讨论图像从FFT到逆FFT的频率变换所涉及的各个阶段,并结合FFT移位和逆FFT移位的使用。本文使用了三个Python库,分别是openCV、Numpy和Matplotlib。importcv2importnumpyasnpfrommatplotlibimportpyplotaspltimg=cv2.imread('sample.png',0)#使用0以灰度模式读取图像plt.imshow(img,cmap='gray')#cmap用于指定imshow图像在greyscaleplt.xticks([]),plt.yticks([])#removetickmarksplt.show()1.快速傅里叶变换(FFT)快速傅里叶变换(FFT)是一种广泛使用的数学技术,它允许图像从空间域变换到频域,是频率变换的基本组成部分。利用FFT分析,可以得到图像的周期性,并将其分成不同的频率分量,生成图像频谱,显示每幅图像的每个频率分量的幅度和相位。f=np.fft.fft2(img)#图像'img'被传递给np.fft.fft2()来计算它的二维离散傅里叶变换fmag=20*np.log(np.abs(f))plt.imshow(mag,cmap='gray')#cmap='gray'参数表示图像应该以灰度显示。plt.title('MagnitudeSpectrum')plt.xticks([]),plt.yticks([])plt.show()上面的代码使用np.abs()来计算傅里叶变换f的幅度,np。log()转换为对数刻度,然后乘以20以获得以分贝为单位的幅度。这样做是为了使幅度谱更易于可视化和解释。2.FFTshift为了将滤波算法应用于图像,使用FFTshift将图像的零频率分量移动到频谱的中心fshift=np.fft.fftshift(f)mag=20*np.log(np.abs(fshift))plt.imshow(mag,cmap='gray')plt.title('居中谱'),plt.xticks([]),plt.yticks([])plt.show()3.滤波器频率变换的目的之一是利用各种滤波算法来降低噪声,提高图像质量。两种最常用的图像锐化滤波器是理想高通滤波器和高斯高通滤波器。这些滤波器都用于通过快速傅里叶变换(FFT)方法获得的图像的频域表示。理想的高通滤波器是一个无限长的滤波器,具有无限的频率带宽和理想的通带和阻带响应。其通带内所有频率的信号被完全通过,而其阻带内所有频率的信号被完全抑制。在频域中,理想滤波器的幅频响应为:在通带中,幅频响应为1,在阻带中,幅频响应为0在时域中,理想滤波器的脉冲响应滤波器是:在通带In-band中,脉冲响应是无限长的单位脉冲函数序列。在阻带中,脉冲响应为零。由于理想滤波器在频域具有无限带宽,在实际应用中无法实现。实际中使用的数字滤波器通常是基于对理想滤波器的逼近,因此只是一个Ideal。高斯高通滤波器(Gaussianhigh-passfilter)是数字图像处理中常用的一种滤波器。它的作用是保留图像中的高频细节,抑制低频信号。该滤波器基于高斯函数,具有平滑的频率响应,可适应各种图像细节。高斯高通滤波器的频率响应可表示为:H(u,v)=1-L(u,v)其中,L(u,v)为低通滤波器,可表示为通过高斯函数。高通滤波器的响应可以用1减去低通滤波器的响应得到。实际中,高斯函数通常通过不同的参数设置来调整以达到不同的滤波效果。圆形掩模(圆盘形图像)用于定义在对图像进行傅里叶变换时要保留或抑制的频率分量。在本文中,理想滤波器通常是指理想的低通或高通滤波器,可以在频域中选择性地保留或抑制特定频率范围内的信号。将这个理想滤波器应用到图像的傅里叶变换后,再进行逆变换,就可以得到滤波器处理后的图像。具体细节我们就不介绍了,直接看代码:下面这个函数是生成理想高通和低通滤波器的圆形maskimportmathdefdistance(point1,point2):returnmath.sqrt((point1[0]-point2[0])**2+(point1[1]-point2[1])**2)defidealFilterLP(D0,imgShape):base=np.zeros(imgShape[:2])rows,cols=imgShape[:2]center=(rows/2,cols/2)forxinrange(cols):foryinrange(rows):ifdistance((y,x),center)