作业题目:
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/
转载文章受原作者版权保护。转载请注明原作者出处!