理想低通滤波

理想低通滤波是滤掉高频部分,仅允许低频通过,以去掉噪声,使图像得到平滑。

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越低,能通过的频率分量越少,图像就越模糊,并且会有振铃现象。当截止频率越高,能滤过的频率分量越多,图像就越清晰。

理想低通滤波_第1张图片

你可能感兴趣的:(图像处理,opencv)