理想低通滤波是滤掉高频部分,仅允许低频通过,以去掉噪声,使图像得到平滑。
1. 将图像进行傅里叶变换,将低频移至中心
2. 在频域进行处理,首先,计算理想低通滤波器,然后将其与傅里叶频谱相乘。
3. 傅里叶反变换回空间域
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import suanfa as sf
mpl.rcParams['font.sans-serif'] = ['SimHei']
def low_pass_kernel(img, cut_off):
assert img.ndim == 2
r,c = img.shape[1], img.shape[0]
u = np.arange(r)
v = np.arange(c)
u,v = np.meshgrid(u,v)
low_pass = np.sqrt( (u-r/2)**2 + (v-c/2)**2 )
low_pass[ low_pass <= cut_off ] = 1
low_pass[ low_pass >= cut_off ] = 0
return low_pass
def ditong(img, D):
M, N = img.shape
k = low_pass_kernel(img, D)
gray = img.copy() # 复制图片
gray = np.float64(gray) # 转换为float64
gray_f = np.fft.fft2(gray) # 傅里叶变换
gray_fshift = np.fft.fftshift(gray_f) # 低频移至中心
dst = np.zeros_like(gray_fshift) # 构建目标矩阵,初始化全为0
dst_filter = k*gray_fshift # 低通滤波与原图相乘
dst_ifftshit = np.fft.ifftshift(dst_filter) # 反向移动到原来位置
dst_ifft = np.fft.ifft2(dst_ifftshit) # 傅里叶反变换
dst_ifft = np.abs(dst_ifft)
return dst_ifft
img = cv.imread('lena512color.tiff', 0)
img = sf.add_noise(img, 2000)
dst1 = ditong(img, 5)
dst2 = ditong(img, 10)
dst3 = ditong(img, 20)
dst4 = ditong(img, 30)
dst5 = ditong(img, 50)
plt.subplot(231),plt.imshow(img, cmap='gray'),plt.axis('off'),plt.title('原图')
plt.subplot(232),plt.imshow(dst1, cmap='gray'),plt.axis('off'),plt.title('低通滤波,D=5')
plt.subplot(233),plt.imshow(dst2, cmap='gray'),plt.axis('off'),plt.title('低通滤波,D=10')
plt.subplot(234),plt.imshow(dst3, cmap='gray'),plt.axis('off'),plt.title('低通滤波,D=20')
plt.subplot(235),plt.imshow(dst4, cmap='gray'),plt.axis('off'),plt.title('低通滤波,D=30')
plt.subplot(236),plt.imshow(dst5, cmap='gray'),plt.axis('off'),plt.title('低通滤波,D=50')
plt.show()
左图是原图,其余全是理想低通滤波器滤波后的图,只是截止频率不一样。从图中可以看出,当截止频率D0越低,能通过的频率分量越少,图像就越模糊,并且会有振铃现象。当截止频率越高,能滤过的频率分量越多,图像就越清晰。