逆滤波和维纳滤波在图像处理的Python代码

课程作业

代码测试过,是没问题的。

import matplotlib.pyplot as plt
import numpy as np
from numpy import fft

import math
import cv2

def make_PSF(kernel_size=15, angle=60):
    PSF = np.diag(np.ones(kernel_size))  # 初始模糊核的方向是-45度
    angle = angle + 45  # 抵消-45度的影响
    M = cv2.getRotationMatrix2D((kernel_size / 2, kernel_size / 2), angle, 1)  # 生成旋转算子
    PSF = cv2.warpAffine(PSF, M, (kernel_size, kernel_size), flags=cv2.INTER_LINEAR)  #实现旋转变换
    PSF = PSF / PSF.sum()                #使模糊核的权重和为1
    return PSF

#此函数扩展PSF0,使之与image0一样大小
def extension_PSF(image0,PSF0):
    [img_h,img_w] = image0.shape
    [h,w] = PSF0.shape
    PSF=np.zeros((img_h,img_w))
    PSF[0:h, 0:w] = PSF0             
    return PSF
# 在频域对图片进行运动模糊
def make_blurred(input, PSF, eps):
    input_fft =np.fft.fft2(input)               # 对输入图像进行傅里叶变换
    PSF_fft = np.fft.fft2(PSF) + eps # 对运动模糊核进行傅里叶变换,并加上一个很小的数
    blurred = np.fft.ifft2(input_fft * PSF_fft)  #在频域进行运动模糊
    blurred=np.abs(blurred)
    return blurred
def inverse(input, PSF, eps):  # 逆滤波
    input_fft = np.fft.fft2(input)              #对退化图像进行傅里叶变换
    PSF_fft = np.fft.fft2(PSF) + eps              # 对运动模糊核进行傅里叶变换,并加上一个很小的数
    Output_fft = input_fft / PSF_fft    #在频域进行逆滤波
    result = np.fft.ifft2(Output_fft)          # 进行傅里叶反变换
    result = np.abs(result)
    return result

def wiener(input, PSF, eps, K=0.01):  # 维纳滤波
    input_fft = np.fft.fft2(input)
    PSF_fft = np.fft.fft2(PSF)
    PSF_fft_1 = (np.conj(PSF_fft) / (np.abs(PSF_fft)**2 + K))*input_fft  #根据公式写就够了          
    result = np.fft.ifft2(PSF_fft_1)
    result = np.abs(result)
    return result

if __name__=="__main__":
    image = cv2.imread('./img/kennysmall.jpg')#这是你要搞得图片
    image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    
    eps = 1e-3
    plt.figure(1)
     # 进行运动模糊处理
    PSF = make_PSF(15, 60)
    #扩展PSF,使其与图像一样大小
    PSF =  extension_PSF(image, PSF)            
    blurred = make_blurred(image, PSF, eps)        #在频域对图像进行运动模糊

    # 添加噪声,standard_normal产生随机的函数
    blurred_noisy = blurred + 0.1 * blurred.std() * \
                    np.random.standard_normal(blurred.shape)
    #numpy.random.normal(loc=0.0, scale=1.0, size=None)
    plt.figure(figsize=(8,6))
    plt.subplot(131)
    plt.axis("off")
    plt.gray(),plt.title("motion & noisy blurred"),plt.imshow(blurred_noisy)  # 显示添加噪声且运动模糊的图像

    result = inverse(blurred_noisy, PSF, eps)             # 对添加噪声的图像进行逆滤波
    plt.subplot(132)
    plt.axis("off"), plt.title("inverse deblurred"), plt.imshow(result)

    result = wiener(blurred_noisy, PSF, eps, K=0.01)              # 对添加噪声的图像进行维纳滤波
    plt.subplot(133)
    plt.axis("off"), plt.title("wiener deblurred(k=0.01)"), plt.imshow(result)

plt.show()

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