现代数字图像处理作业----用维纳滤波器进行图像复原
1、任选一张彩色风景图片作为源图像,设置不同的模糊参数实现任一幅图像的运动模糊(fspecial,imfilter),再用imadd和imnoise给图像添加不同类型的噪声,显示噪声图像。2、对1产生的图像分别进行复原,选用维纳滤波器进行图像复原,显示处理结果。
·
作业题目:
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()
更多推荐
已为社区贡献1条内容
所有评论(0)