现代数字图像处理作业—-用维纳滤波器进行图像复原

作业题目:

1、任选一张彩色风景图片作为源图像,设置不同的模糊参数实现任一幅图像的运动模糊(fspecial,imfilter),再用imadd和imnoise给图像添加不同类型的噪声,显示噪声图像。

2、对1产生的图像分别进行复原,选用维纳滤波器进行图像复原,显示处理结果。

作业代码及内容展示和分析:

原始图像、添加运动模糊后分别加入不同噪声图像:

现代数字图像处理作业----用维纳滤波器进行图像复原

对1产生的图像进行维纳滤波处理后的恢复图像:

现代数字图像处理作业----用维纳滤波器进行图像复原

分析:维纳滤波对添加了运动噪声的图像恢复有一定的效果,对添加椒盐噪声后的图像恢复变成了逆滤波。

代码展示:

-*- coding:utf-8 -*-
import cv2 as cv
import numpy as np
import random as rd
import math

### 图像加入椒盐噪声
def saltNoise_image(im,var):
    h,w = im.shape[:2]
    saltNoiseNum = int(w*h*var)
    all_xy_pos = [[[i,j] for j in range(w)]for i in range(h)]
    xy = []
    for i in all_xy_pos:
        xy.extend(i)
    salt_xy = rd.sample(xy,saltNoiseNum)
    for i,j in salt_xy:
        ra = rd.choice([0,1])
        if ra == 0:
            im[i,j] = 0
        else:
            im[i,j] = 255
    return im
###

### 图像加入运动噪声
#ang运动角度(图像左上向右为0度),dist为运动距离(像素)
def sport_noise_2(im,ang,dist):
    Sport_mask = np.zeros(im.shape[:2])
    xc = im.shape[0]//2
    yc = im.shape[1]//2
    if ang > 180:
        ang = ang % 180
    sin_val = math.sin(ang * math.pi / 180)
    cos_val = math.cos(ang * math.pi / 180)

    for i in range(dist):
        xo = round(sin_val * i)
        yo = round(cos_val * i)
        Sport_mask[int(xc + xo),int(yc + yo)] = 1   #4个方向的速度
    return Sport_mask / Sport_mask.sum()            #返回时域掩码数组(退化函数)

def pro_sport_image(im,mask):
    im = im/255
    im_fft = np.fft.fft2(im)
    mask_fft = np.fft.fft2(mask)
    im_noise = np.fft.ifft2(im_fft * mask_fft)
    im_noise = np.abs(np.fft.fftshift(im_noise))
    return im_noise                                 #返回噪声图

def sport_noise(im,ang,dist,k=1):
    mask = sport_noise_2(im,ang,dist)
    if len(im.shape) == 2:
        image = pro_sport_image(im,mask)
        return image * k
    elif len(im.shape) == 3:
        bgr = cv.split(im)
        new_bgr = []
        for i in range(len(bgr)):
            image = pro_sport_image(bgr[i],mask)
            new_bgr.append(image)
        image = cv.merge(tuple(new_bgr))
        return image * k
###

### 维纳滤波
def weiner_filter_2(im,S,eps,SNR):
    im_fft = np.fft.fft2(im)
    S_fft = np.fft.fft2(S) + eps
    WN_fft = np.conj(S_fft)/(np.abs(S_fft)**2 + SNR)
    inv_fft = np.fft.ifft2(im_fft * WN_fft)
    inv_fft = np.abs(np.fft.fftshift(inv_fft))
    return inv_fft

def weiner_filter(im,S,eps,SNR):    #主函数#
    if len(im.shape) == 2:
        wn_image = weiner_filter_2(im,S,eps,SNR)
        return (wn_image*255).astype('uint8')
    elif len(im.shape) == 3:
        bgr = cv.split(im)
        new_bgr = []
        for i in range(len(bgr)):
            img = weiner_filter_2(bgr[i],S,eps,SNR)
            new_bgr.append(img)
        wn_image = cv.merge(tuple(new_bgr))
        return (wn_image*255).astype('uint8')
###

view = cv.imread('flower.jpg')
viewc = view.copy()

salt_view = saltNoise_image(view.copy(),0.1)
sport_view = sport_noise(view.copy(),ang=20,dist=20,k=1)

salt_sport_view = sport_noise(salt_view.copy(),ang=20,dist=20,k=1)
sport_salt_view = saltNoise_image(sport_view.copy(),0.1)

S = sport_noise_2(sport_view,ang=20,dist=20)
wn_salt_sport_view = weiner_filter(salt_sport_view.copy(),S,0.01,0.01)
wn_sport_salt_view = weiner_filter(sport_salt_view.copy(),S,0.01,0.01)

cv.imwrite('3.jpg',wn_salt_sport_view)
cv.imwrite('4.jpg',wn_sport_salt_view)
cv.imshow('1',salt_sport_view)
cv.imshow('2',sport_salt_view)
cv.imshow('3',wn_salt_sport_view)
cv.imshow('4',wn_sport_salt_view)

cv.waitKey(0)
cv.destroyAllWindows()

Original: https://blog.csdn.net/qq_56133122/article/details/124121702
Author: 启程.py
Title: 现代数字图像处理作业—-用维纳滤波器进行图像复原

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/641510/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球