python实现逆滤波与维纳滤波示例


Posted in Python onFebruary 26, 2020

构建运动模糊模型

现假定相机不动,图像f(x,y)在图像面上移动并且图像f(x,y)除移动外不随时间变化。令x0(t)和y0(t)分别代表位移的x分量和y分量,那么在快门开启的时间T内,胶片上某点的总曝光量是图像在移动过程中一系列相应像素的亮度对该点作用之总和。也就是说,运动模糊图像是由同一图像在产生距离延迟后与原图像想叠加而成。如果快门开启与关闭的时间忽略不计,则有:

python实现逆滤波与维纳滤波示例

由于各种运动都是匀速直线运动的叠加,因而我们只需考虑匀速直线运动即可。但由于我们自身水平有限,且旨在探讨找到实现运动模糊复原方法的思想与方向,因而我们未能自行构建模型,而是借鉴了参考文献[1]中建立的运动模糊模型。关于本模型的理论依据参见参考文献[1].

下面我们描述一下该模型函数motion_process(image_size,motion_angle),它包含两个参数:图像的尺寸大小image_size以及运动的角度motion_angle。

例如,当运动位移为9、运动角度为45度时,则该模型函数的构建过程如下:

1. 首先是创建与图像同等大小的全0矩阵,然后找到全0矩阵的中心行数center_position,再计算出运动角度的tan值与cot值,算出运动的偏移量offset。

2. python实现逆滤波与维纳滤波示例PSF[int(center_position+offset),int(center_position-offset)]=1

3. python实现逆滤波与维纳滤波示例PSF[int(center_position-offset),int(center_position+offset)]=1

则该模型对应的图像如下图所示:

python实现逆滤波与维纳滤波示例

运动位移为9,运动角度分别为45°、30°、60°时,运动模糊模型对应的图像

import matplotlib.pyplot as graph
import numpy as np
from numpy import fft
import math
import cv2
 
# 仿真运动模糊
def motion_process(image_size,motion_angle):
 PSF = np.zeros(image_size)
 print(image_size)
 center_position=(image_size[0]-1)/2
 print(center_position)
 
 slope_tan=math.tan(motion_angle*math.pi/180)
 slope_cot=1/slope_tan
 if slope_tan<=1:
  for i in range(15):
   offset=round(i*slope_tan) #((center_position-i)*slope_tan)
   PSF[int(center_position+offset),int(center_position-offset)]=1
  return PSF / PSF.sum() #对点扩散函数进行归一化亮度
 else:
  for i in range(15):
   offset=round(i*slope_cot)
   PSF[int(center_position-offset),int(center_position+offset)]=1
  return PSF / PSF.sum()
 
#对图片进行运动模糊
def make_blurred(input, PSF, eps):
 input_fft = fft.fft2(input)# 进行二维数组的傅里叶变换
 PSF_fft = fft.fft2(PSF)+ eps
 blurred = fft.ifft2(input_fft * PSF_fft)
 blurred = np.abs(fft.fftshift(blurred))
 return blurred
 
def inverse(input, PSF, eps):  # 逆滤波
 input_fft = fft.fft2(input)
 PSF_fft = fft.fft2(PSF) + eps #噪声功率,这是已知的,考虑epsilon
 result = fft.ifft2(input_fft / PSF_fft) #计算F(u,v)的傅里叶反变换
 result = np.abs(fft.fftshift(result))
 return result
 
def wiener(input,PSF,eps,K=0.01):  #维纳滤波,K=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 + K)
 result=fft.ifft2(input_fft * PSF_fft_1)
 result=np.abs(fft.fftshift(result))
 return result
 
image = cv2.imread('you.jpg')
image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
img_h=image.shape[0]
img_w=image.shape[1]
graph.figure(1)
graph.xlabel("Original Image")
graph.gray()
graph.imshow(image)  #显示原图像
 
graph.figure(2)
graph.gray()
#进行运动模糊处理
PSF = motion_process((img_h,img_w), 60)
blurred = np.abs(make_blurred(image, PSF, 1e-3))
 
graph.subplot(231)
graph.xlabel("Motion blurred")
graph.imshow(blurred)
 
result = inverse(blurred, PSF, 1e-3) #逆滤波
graph.subplot(232)
graph.xlabel("inverse deblurred")
graph.imshow(result)
 
result=wiener(blurred,PSF,1e-3)  #维纳滤波
graph.subplot(233)
graph.xlabel("wiener deblurred(k=0.01)")
graph.imshow(result)
 
blurred_noisy=blurred + 0.1 * blurred.std() * \
   np.random.standard_normal(blurred.shape) #添加噪声,standard_normal产生随机的函数
 
graph.subplot(234)
graph.xlabel("motion & noisy blurred")
graph.imshow(blurred_noisy)  #显示添加噪声且运动模糊的图像
 
result = inverse(blurred_noisy, PSF, 0.1+1e-3) #对添加噪声的图像进行逆滤波
graph.subplot(235)
graph.xlabel("inverse deblurred")
graph.imshow(result)
 
result=wiener(blurred_noisy,PSF,0.1+1e-3)   #对添加噪声的图像进行维纳滤波
graph.subplot(236)
graph.xlabel("wiener deblurred(k=0.01)")
graph.imshow(result)
 
graph.show()

参考文献

[1] 何红英. 运动模糊图像恢复算法的研究与实现[D]. 西安科技大学硕士学位论文. 2011.

[2] Rafael C.Gonzalez,Richard E.Woods,Steven L.Eddins. 数字图像处理的MATLAB实现(第2版)[M]. 阮秋琦,译. 北京:清华大学出版社,2013.

[3] 陈建功. 运动模糊图像复原算法研究[D]. 南昌航空大学硕士学位论文. 2012.

以上这篇python实现逆滤波与维纳滤波示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python获取元素在数组中索引号的方法
Jul 15 Python
Python的pycurl包用法简介
Nov 13 Python
python处理csv数据动态显示曲线实例代码
Jan 23 Python
Python下载网络文本数据到本地内存的四种实现方法示例
Feb 05 Python
numpy库与pandas库axis=0,axis= 1轴的用法详解
May 27 Python
python安装numpy和pandas的方法步骤
May 27 Python
Django网络框架之创建虚拟开发环境操作示例
Jun 06 Python
Pandas之groupby( )用法笔记小结
Jul 23 Python
对Pytorch中nn.ModuleList 和 nn.Sequential详解
Aug 18 Python
利用Pycharm + Django搭建一个简单Python Web项目的步骤
Oct 22 Python
理解深度学习之深度学习简介
Apr 14 Python
Pyhton爬虫知识之正则表达式详解
Apr 01 Python
Python全面分析系统的时域特性和频率域特性
Feb 26 #Python
解决pycharm每次打开项目都需要配置解释器和安装库问题
Feb 26 #Python
Python中os模块功能与用法详解
Feb 26 #Python
Python中sys模块功能与用法实例详解
Feb 26 #Python
Python线程threading模块用法详解
Feb 26 #Python
Python图像处理库PIL中图像格式转换的实现
Feb 26 #Python
Python基础之字典常见操作经典实例详解
Feb 26 #Python
You might like
Fine Uploader文件上传组件应用介绍
2013/01/06 PHP
thinkphp在模型中自动完成session赋值示例代码
2014/09/09 PHP
PHP实践教程之过滤、验证、转义与密码详解
2017/07/24 PHP
JavaScript Cookie 直接浏览网站分网址
2009/12/08 Javascript
Javascript读取cookie函数代码
2010/10/16 Javascript
JS实现的通用表单验证插件完整实例
2015/08/20 Javascript
实现非常简单的js双向数据绑定
2015/11/06 Javascript
JS中常用的输出方式(五种)
2016/06/12 Javascript
AngularJS表单详解及示例代码
2016/08/17 Javascript
JS判断是否为JSON对象及是否存在某字段的方法(推荐)
2016/11/29 Javascript
Vue.js实战之通过监听滚动事件实现动态锚点
2017/04/04 Javascript
详解使用create-react-app快速构建React开发环境
2018/05/16 Javascript
Vue中的v-for循环key属性注意事项小结
2018/08/12 Javascript
JavaScript链式调用实例浅析
2018/12/19 Javascript
vue开发环境配置跨域的方法步骤
2019/01/16 Javascript
vue下载excel的实现代码后台用post方法
2019/05/10 Javascript
小程序实现左滑删除的效果的实例代码
2020/10/19 Javascript
python传递参数方式小结
2015/04/17 Python
Python操作csv文件实例详解
2017/07/31 Python
Python有序查找算法之二分法实例分析
2017/12/11 Python
Python 网络爬虫--关于简单的模拟登录实例讲解
2018/06/01 Python
梅尔倒谱系数(MFCC)实现
2019/06/19 Python
基于Python的图像数据增强Data Augmentation解析
2019/08/13 Python
基于Python获取城市近7天天气预报
2019/11/26 Python
Django基于客户端下载文件实现方法
2020/04/21 Python
TensorFlow Autodiff自动微分详解
2020/07/06 Python
Canvas 文本转粒子效果的实现代码
2019/02/14 HTML / CSS
C/C++ 笔试、面试题目大汇总
2015/11/21 面试题
27个经典Linux面试题及答案,你知道几个?
2014/03/11 面试题
手机被没收检讨书
2014/02/22 职场文书
党的群众路线教育实践活动个人对照检查材料范文
2014/09/25 职场文书
安全第一课观后感
2015/06/18 职场文书
大学生先进个人主要事迹材料
2015/11/04 职场文书
2016入党培训心得体会范文
2016/01/08 职场文书
Matplotlib绘制混淆矩阵的实现
2021/05/27 Python
德劲DE1102数字调谐收音机机评
2022/04/07 无线电