频域滤波
频域滤波是在频率域对图像做处理的一种方法。步骤如下:
1.理想的高/低通滤波器
顾名思义,高通滤波器为:让高频信息通过,过滤低频信息;低通滤波相反。滤波器大小和频谱大小相同,
理想的低通滤波器模板为:
其中,D0表示通带半径,D(u,v)是到频谱中心的距离(欧式距离),计算公式如下:
M和N表示频谱图像的大小,(M/2,N/2)即为频谱中心
理想的高通滤波器与此相反,1减去低通滤波模板即可。
代码如下:(D0=20)
"""理想的高/低通滤波器""" import numpy as np import matplotlib.pyplot as plt import cv2 # 定义函数,显示滤波器 def showTemplate(template): temp = template*255 cv2.imshow(‘Template‘, temp) cv2.waitKey(0) cv2.destroyAllWindows() return # 定义函数,显示滤波函数 def showFunction(template): m, n = template.shape m = np.uint16(m/2) n = np.uint16(n/2) y = template[m, n:] x = np.arange(len(y)) plt.plot(x, y, ‘b-‘, linewidth=2) plt.axis([0, len(x), -0.2, 1.2]) plt.show() # 定义函数,完成高通低通滤波 def lowAndhigh_pass(src, filter_cdtion, filter_type): template = np.zeros(src.shape, dtype=np.float32) # 构建滤波器 m, n = src.shape for i in range(m): for j in range(n): distance = np.sqrt((i-m/2)**2+(j-n/2)**2) if distance < filter_cdtion: template[i, j] = 1 else: template[i, j] = 0 if filter_type == 1: template = 1 - template showFunction(template) showTemplate(template) img_dft = np.fft.fft2(src) # 傅立叶变换,进行滤波 img_fshift = np.fft.fftshift(img_dft) # 中心化 new_img = img_fshift*template # 滤波 img_ifshift = np.fft.ifftshift(new_img) # 边缘化 img = np.fft.ifft2(img_ifshift) # 傅立叶逆变换 img = np.abs(img) img = np.uint8(img + 0.5) return img img_input = cv2.imread(r‘F:\program_study\Python\data\woman.tif‘, cv2.IMREAD_GRAYSCALE) cv2.imshow(‘orig_img‘, img_input) img_out = lowAndhigh_pass(img_input, 20, 0) # 0代表低通 cv2.imshow(‘lowPass_img‘, img_out) # img_out1 = lowAndhigh_pass(img_input, 20, 1) # 1代表高通 # cv2.imshow(‘highPass_img‘, img_out1) cv2.waitKey(0) cv2.destroyAllWindows()