赞
踩
之前的图像处理,都是再原图上进行;而频率域滤波,是在图像的傅里叶谱上进行处理,最后再通过傅里叶逆变换得到处理后的图像,则是因为图片的傅里叶谱包含图片的频率信息,方便对其频率进行处理。对于图像,低频信息表示图像中灰度值缓慢变化的区域,如背景信息等;而高频信息则表示灰度值迅速变化的区域,如边缘处等细节信息。
在经过中心化后的傅立叶谱(幅度谱),其中心位置的幅度值最大,频率最低,随着离中心位置的距离增加频率会越来越大,所以,中心化后的傅里叶谱,中心位置为低频区域,四个角落处为高频区域。频率域滤波通常的处理步骤如下:
常用的滤波器有四种:低通滤波器,高通滤波器,带通滤波器,带阻滤波器
低通滤波器
低通滤波器,即保留傅里叶变换的低频信息,过滤掉高频信息,会使图片变得更模糊。常用的低通滤波器包括理想低通滤波器,巴特沃斯低通滤波器,高斯低通滤波器。假设图像傅里叶变换的高,宽为H、W,傅里叶谱的最大值在中心点位置(maxR, maxC), D(r, c)代表点(r, c)到中心点的距离:
那么三种滤波器可以表示为:
理想低通滤波器:
巴特沃斯低通滤波器:
高斯低通滤波器:
低通滤波器的使用代码及结果如下:
#coding:utf-8import cv2
import numpyasnp
def createLPFilter(shape, center, radius, lpType=2, n=2):
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_matrix=np.zeros(shape, np.float32)if lpType == 0: # 理想低通滤波器
lpFilter=np.copy(d)
lpFilter[lpFilter< pow(radius, 2.0)] = 1lpFilter[lpFilter>= pow(radius, 2.0)] = 0elif lpType== 1: #巴特沃斯低通滤波器
lpFilter= 1.0 / (1 + np.power(np.sqrt(d)/radius, 2*n))
elif lpType== 2: # 高斯低通滤波器
lpFilter= np.exp(-d/(2*pow(radius, 2.0)))
lpFilter_matrix[:, :,0] =lpFilter
lpFilter_matrix[:, :,1] =lpFilterreturnlpFilter_matrix
def stdFftImage(img_gray, rows, cols):
fimg=np.copy(img_gray)
fimg=fimg.astype(np.float32) #注意这里的类型转换
#1.图像矩阵乘以(-1)^(r+c), 中心化for r inrange(rows):for c inrange(cols):if (r+c) % 2:
fimg[r][c]= -1 *img_gray[r][c]
img_fft=fftImage(fimg, rows, cols)returnimg_fft
def fftImage(img_gray, rows, cols):
rPadded=cv2.getOptimalDFTSize(rows)
cPadded=cv2.getOptimalDFTSize(cols)
imgPadded= np.zeros((rPadded, cPadded), dtype=np.float32)
imgPadded[:rows, :cols]=img_gray
img_fft= cv2.dft(imgPadded, flags=cv2.DFT_COMPLEX_OUTPUT)returnimg_fft
def graySpectrum(fft_img):
real= np.power(fft_img[:, :, 0], 2.0)
imaginary= np.power(fft_img[:, :, 1], 2.0)
amplitude= np.sqrt(real+imaginary)
spectrum= np.log(amplitude+1.0)
spectrum= cv2.normalize(spectrum, 0, 1, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)
spectrum*= 255
returnamplitude, spectrum
def nothing(args):
passif __name__ == "__main__":
img_file= r"C:\Users\silence_cho\Desktop\Messi.jpg"# img_file= r"D:\data\receipt_rotate.jpg"img_gray= cv2.imread(img_file, 0)
#1.快速傅里叶变换
rows, cols= img_gray.shape[:2]
img_fft=stdFftImage(img_gray, rows, cols)
amplitude, _=graySpectrum(img_fft)
minValue, maxValue, minLoc, maxLoc=cv2.minMaxLoc(amplitude) #中心化后频谱的最大值在图片中心位置处
cv2.namedWindow("tracks")
max_radius= np.sqrt(pow(rows, 2) + pow(cols, 2))/2cv2.createTrackbar("Radius", "tracks", 0, int(max_radius), nothing)
cv2.createTrackbar("Filter type", "tracks", 0, 2, nothing)whileTrue:
#2.构建低通滤波器
radius= cv2.getTrackbarPos("Radius", "tracks")
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。