新手建设html5网站,wordpress淘宝客类网站建设,关于建设网站的书本,网站建设招聘系统介绍 频率阈图像滤波是一种在频域中进行图像处理的方法#xff0c;它基于图像的频率分布来实现滤波效果。具体步骤如下#xff1a;
将原始图像转换到频域#xff1a;使用快速傅里叶变换#xff08;FFT#xff09;将图像从空间域转换到频域。对频域图像应用频率阈滤波器它基于图像的频率分布来实现滤波效果。具体步骤如下
将原始图像转换到频域使用快速傅里叶变换FFT将图像从空间域转换到频域。对频域图像应用频率阈滤波器根据要实现的滤波效果设计一个频率阈滤波器。该滤波器可以是低通滤波器、高通滤波器或带通滤波器。将频率阈滤波器应用于频域图像将设计好的频率阈滤波器应用于频域图像通过乘法操作将频域图像与滤波器进行卷积。将滤波后的频域图像转换回空域使用快速傅里叶逆变换IFFT将滤波后的频域图像转换回空域。可选对输出图像进行后处理根据需要可以对输出图像进行一些后处理操作如归一化、增强对比度等。 通过频率阈图像滤波可以实现一些常见的图像处理任务如去噪、边缘检测、图像锐化等。但是需要注意频率阈图像滤波对于图像中的高频细节信息可能会有损失因此在选择滤波器和阈值时需要平衡图像的细节保留和滤波效果。
代码
# -*- coding: utf-8 -*-
import sys
import numpy as np
import cv2
#截止频率
radius 50
MAX_RADIUS 100
#低通滤波类型
lpType 0
MAX_LPTYPE 2
#快速傅里叶变换
def fft2Image(src):#得到行、列r,c src.shape[:2]#得到快速傅里叶变换最优rPadded cv2.getOptimalDFTSize(r)cPadded cv2.getOptimalDFTSize(c)#边缘扩充下边缘和右边缘扩充值为零fft2 np.zeros((rPadded,cPadded,2),np.float32)fft2[:r,:c,0]src#快速傅里叶变换cv2.dft(fft2,fft2,cv2.DFT_COMPLEX_OUTPUT)return fft2#傅里叶幅度谱
def amplitudeSpectrum(fft2):#求幅度real2 np.power(fft2[:,:,0],2.0)Imag2 np.power(fft2[:,:,1],2.0)amplitude np.sqrt(real2Imag2)return amplitude
#幅度谱的灰度级显示
def graySpectrum(amplitude):#对比度拉伸#cv2.log(amplitude1.0,amplitude)amplitude np.log(amplitude1.0)#归一化,傅里叶谱的灰度级显示spectrum np.zeros(amplitude.shape,np.float32)cv2.normalize(amplitude,spectrum,0,1,cv2.NORM_MINMAX)return spectrum
#构建低通滤波器
def createLPFilter(shape,center,radius,lpType0,n2):#滤波器的高和宽rows,cols shape[:2]r,c np.mgrid[0:rows:1,0:cols:1]c-center[0]r-center[1]d np.power(c,2.0)np.power(r,2.0)#构造低通滤波器lpFilter np.zeros(shape,np.float32)if(radius0):return lpFilterif(lpType 0):#理想低通滤波lpFilter np.copy(d)lpFilter[lpFilterpow(radius,2.0)]1lpFilter[lpFilterpow(radius,2.0)]0elif(lpType 1): #巴特沃斯低通滤波lpFilter 1.0/(1.0np.power(np.sqrt(d)/radius,2*n))elif(lpType 2): #高斯低通滤波lpFilter np.exp(-d/(2.0*pow(radius,2.0)))return lpFilter
#主函数
if __name__ __main__:if len(sys.argv) 1:#第一步读入图像#image cv2.imread(sys.argv[1],cv2.CV_LOAD_IMAGE_GRAYSCALE)image cv2.imread(sys.argv[1],cv2.IMREAD_GRAYSCALE)else:print (Usge:python LPFilter.py imageFile)#显示原图cv2.imshow(image,image)#第二步每一元素乘以 (-1)^(rc)fimage np.zeros(image.shape,np.float32)for r in range(image.shape[0]):for c in range(image.shape[1]):if (rc)%2:fimage[r][c] -1*image[r][c]else:fimage[r][c] image[r][c]#第三和四步补零和快速傅里叶变换fImagefft2 fft2Image(fimage)#傅里叶谱amplitude amplitudeSpectrum(fImagefft2)#傅里叶谱的灰度级显示spectrum graySpectrum(amplitude)cv2.imshow(originalSpectrum,spectrum)#找到傅里叶谱最大值的位置minValue,maxValue,minLoc,maxLoc cv2.minMaxLoc(amplitude)#低通傅里叶谱灰度级的显示窗口cv2.namedWindow(lpFilterSpectrum,1)def nothing(*arg):pass#调节低通滤波类型cv2.createTrackbar(lpType,lpFilterSpectrum,lpType,MAX_LPTYPE,nothing)#调节截断频率cv2.createTrackbar(radius,lpFilterSpectrum,radius,MAX_RADIUS,nothing)#低通滤波结果result np.zeros(spectrum.shape,np.float32)while True:#得到当前的截断频率、低通滤波类型radius cv2.getTrackbarPos(radius,lpFilterSpectrum)lpType cv2.getTrackbarPos(lpType,lpFilterSpectrum)#第五步构建低通滤波器lpFilter createLPFilter(spectrum.shape,maxLoc,radius,lpType)#第六步低通滤波器和快速傅里叶变换对应位置相乘点乘rows,cols spectrum.shape[:2]fImagefft2_lpFilter np.zeros(fImagefft2.shape,fImagefft2.dtype)for i in range(2):fImagefft2_lpFilter[:rows,:cols,i] fImagefft2[:rows,:cols,i]*lpFilter#低通傅里叶变换的傅里叶谱lp_amplitude amplitudeSpectrum(fImagefft2_lpFilter)#显示低通滤波后的傅里叶谱的灰度级lp_spectrum graySpectrum(lp_amplitude)cv2.imshow(lpFilterSpectrum, lp_spectrum)#第七和八步对低通傅里叶变换执行傅里叶逆变换,并只取实部cv2.dft(fImagefft2_lpFilter,result,cv2.DFT_REAL_OUTPUTcv2.DFT_INVERSEcv2.DFT_SCALE)#第九步乘以(-1)^(rc)for r in range(rows):for c in range(cols):if (rc)%2:result[r][c]*-1#第十步数据类型转换,并进行灰度级显示截取左上角大小和输入图像相等for r in range(rows):for c in range(cols):if result[r][c] 0:result[r][c] 0elif result[r][c] 255:result[r][c] 255lpResult result.astype(np.uint8)lpResult lpResult[:image.shape[0],:image.shape[1]]cv2.imshow(LPFilter,lpResult) ch cv2.waitKey(5)if ch 27:breakcv2.waitKey(0)cv2.destroyAllWindows()
运行方式 切换到项目代码所在路径将要测试的图片放在代码的同级目录下执行 python LPFilter.py orange.png 命令即可
效果