python 运动模糊 退化模型 点扩散函数 逆滤波与维纳滤波

点扩散函数

生成点扩散函数,点扩散函数就是运动模糊的退化模型,点扩散函数可以用于逆滤波与维纳滤波

 

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)   #逆滤波

同样,传入参数分别为模糊的图像,点扩散函数,平均噪声功率

 

 

你可能感兴趣的:(python 运动模糊 退化模型 点扩散函数 逆滤波与维纳滤波)