逆滤波与维纳滤波的应用于Python运动模糊和退化模型的点扩散函数
最编程
2024-08-14 14:28:23
...
点扩散函数
生成点扩散函数,点扩散函数就是运动模糊的退化模型,点扩散函数可以用于逆滤波与维纳滤波
def get_motion_dsf(image_size, motion_angle, motion_dis):
PSF = np.zeros(image_size) # 点扩散函数
x_center = (image_size[0] - 1) / 2
y_center = (image_size[1] - 1) / 2
sin_val = math.sin(motion_angle * math.pi / 180)
cos_val = math.cos(motion_angle * math.pi / 180)
# 将对应角度上motion_dis个点置成1
for i in range(motion_dis):
x_offset = round(sin_val * i)
y_offset = round(cos_val * i)
PSF[int(x_center - x_offset), int(y_center + y_offset)] = 1
return PSF / PSF.sum() # 归一化
示例
PSF = get_motion_dsf(image.shape, 135, 150)
第一个参数为图像大小,第二个参数为模糊的角度,第三参数为运动像素点个数
也可以显示点扩散函数
dst = np.zeros(PSF.shape)
norm_psf = cv2.normalize(PSF, dst, 1.0, 0.0, cv2.NORM_MINMAX)
cv2.imshow('psf', (norm_psf*255).astype(np.uint8))
知道退化模型后,就可以通过逆滤波与维纳滤波进行图像复原
维纳滤波
下面是维纳滤波的函数
def wiener(input,PSF,eps,SNR=0.001): #维纳滤波,SNR=0.01
input_fft=fft.fft2(input)
PSF_fft=fft.fft2(PSF) +eps
PSF_fft_1=np.conj(PSF_fft) /(np.abs(PSF_fft)**2 + SNR)
result=fft.ifft2(input_fft * PSF_fft_1)
result=np.abs(fft.fftshift(result))
return result
示例
result=wiener(blurred,PSF,1e-2)
第一个参数为模糊的图像,PSF为点扩散函数,1e-2为平均噪声功率,SNR默认为0.001
逆滤波
逆滤波函数为
def inverse(input, PSF, eps):
input_fft = fft.fft2(input)
PSF_fft = fft.fft2(PSF) + eps #噪声功率
result = fft.ifft2(input_fft / PSF_fft) #计算F(u,v)的傅里叶反变换
result = np.abs(fft.fftshift(result))
return result
示例为
result = inverse(blurred, PSF,1e-3) #逆滤波
同样,传入参数分别为模糊的图像,点扩散函数,平均噪声功率