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并发编程之多进程、多线程、异步和协程详解
Oct 28 Python
详解django中自定义标签和过滤器
Jul 03 Python
Python实现曲线拟合操作示例【基于numpy,scipy,matplotlib库】
Jul 12 Python
基于wxPython的GUI实现输入对话框(2)
Feb 27 Python
python 图片去噪的方法示例
Jul 09 Python
Python使用__new__()方法为对象分配内存及返回对象的引用示例
Sep 20 Python
Python3+Requests+Excel完整接口自动化测试框架的实现
Oct 11 Python
python实现简单的购物程序代码实例
Mar 03 Python
TensorFlow使用Graph的基本操作的实现
Apr 22 Python
python 窃取摄像头照片的实现示例
Jan 08 Python
Pytest中skip和skipif的具体使用方法
Jun 30 Python
pd.drop_duplicates删除重复行的方法实现
Jun 16 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
PHP 文件上传源码分析(RFC1867)
2009/10/30 PHP
PHP中设置时区方法小结
2012/06/03 PHP
PHP实现懒加载的方法
2015/03/07 PHP
发现的以前不知道的函数
2006/09/19 Javascript
javascript 静态对象和构造函数的使用和公私问题
2010/03/02 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(二)人物行走的实现
2013/01/23 Javascript
jquery的ajax跨域请求原理和示例
2014/05/08 Javascript
JavaScript 实现完美兼容多浏览器的复制功能代码
2015/04/28 Javascript
JS实现的在线调色板实例(附demo源码下载)
2016/03/01 Javascript
Bootstrap的class样式小结
2016/12/01 Javascript
微信小程序 Tab页切换更新数据
2017/01/05 Javascript
微信小程序小组件 基于Canvas实现直播点赞气泡效果
2020/05/29 Javascript
基于Nodejs利用socket.io实现多人聊天室
2017/02/22 NodeJs
js实现多行文本框统计剩余字数功能
2017/03/28 Javascript
初识NodeJS服务端开发入门(Express+MySQL)
2017/04/07 NodeJs
jQuery使用eraser.js插件实现擦除、刮刮卡效果的方法【附eraser.js下载】
2017/04/28 jQuery
详解Angular.js中$http拦截器的介绍及使用
2017/07/04 Javascript
详解Chart.js轻量级图表库的使用经验
2018/05/22 Javascript
JavaScript cookie原理及使用实例
2020/05/08 Javascript
vue+koa2搭建mock数据环境的详细教程
2020/05/18 Javascript
[45:52]完美世界DOTA2联赛PWL S3 Forest vs INK ICE 第二场 12.09
2020/12/12 DOTA
python实现的登陆Discuz!论坛通用代码分享
2014/07/11 Python
Python中的下划线详解
2015/06/24 Python
基于Python代码编辑器的选用(详解)
2017/09/13 Python
Python交互环境下实现输入代码
2018/06/22 Python
如何使用pyinstaller打包32位的exe程序
2019/05/26 Python
在python中做正态性检验示例
2019/12/09 Python
python递归调用中的坑:打印有值, 返回却None
2020/03/16 Python
Python根据指定文件生成XML的方法
2020/06/29 Python
python 实现数据库中数据添加、查询与更新的示例代码
2020/12/07 Python
请说出这段代码执行后a和b的值分别是多少
2015/03/28 面试题
电大毕业生自我鉴定
2014/04/10 职场文书
2015年人事科工作总结
2015/04/28 职场文书
舞出我人生观后感
2015/06/16 职场文书
2016年大学生暑期社会实践方案
2015/11/26 职场文书
python使用openpyxl库读写Excel表格的方法(增删改查操作)
2021/05/02 Python