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使用Tkinter显示网络图片的方法
Apr 24 Python
Python中splitlines()方法的使用简介
May 20 Python
python获得一个月有多少天的方法
Jun 04 Python
Python语言描述机器学习之Logistic回归算法
Dec 21 Python
对python修改xml文件的节点值方法详解
Dec 24 Python
pyqt弹出新对话框,以及关闭对话框获取数据的实例
Jun 18 Python
Python logging设置和logger解析
Aug 28 Python
Python3.6+selenium2.53.6自动化测试_读取excel文件的方法
Sep 06 Python
利用Python的turtle库绘制玫瑰教程
Nov 23 Python
python GUI库图形界面开发之PyQt5时间控件QTimer详细使用方法与实例
Feb 26 Python
Python基于yield遍历多个可迭代对象
Mar 12 Python
5分钟快速掌握Python定时任务框架的实现
Jan 26 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中禁止单个IP与ip段访问的代码小结
2012/07/04 PHP
JavaScript学习笔记记录我的旅程
2012/05/23 Javascript
用JQuery 判断某个属性是否存在hasAttr的解决方法
2013/04/26 Javascript
window.onresize 多次触发的解决方法
2013/11/08 Javascript
JavaScript实现的GBK、UTF8字符串实际长度计算函数
2014/08/27 Javascript
node.js中的fs.createReadStream方法使用说明
2014/12/17 Javascript
jquery滚动特效集锦
2015/06/03 Javascript
JS文件上传神器bootstrap fileinput详解
2021/01/28 Javascript
给easyui的datebox控件添加清空按钮的实现方法
2016/11/09 Javascript
jQuery tip提示插件(实例分享)
2017/04/28 jQuery
Javascript中的作用域及块级作用域
2017/12/08 Javascript
vue编译打包本地查看index文件的方法
2018/02/23 Javascript
js实现轮播图的完整代码
2020/10/26 Javascript
js实现select下拉框选择
2020/01/11 Javascript
vue3 watch和watchEffect的使用以及有哪些区别
2021/01/26 Vue.js
[03:55]显微镜下的DOTA2特别篇——430灰烬之灵神级操作
2014/06/24 DOTA
Python设计模式之单例模式实例
2014/04/26 Python
使用Python编写Linux系统守护进程实例
2015/02/03 Python
python里使用正则表达式的组嵌套实例详解
2017/10/24 Python
pandas dataframe的合并实现(append, merge, concat)
2019/06/24 Python
Python上下文管理器类和上下文管理器装饰器contextmanager用法实例分析
2019/11/07 Python
python保留小数位的三种实现方法
2020/01/07 Python
使用PyCharm安装pytest及requests的问题
2020/07/31 Python
python 读取、写入txt文件的示例
2020/09/27 Python
如何将anaconda安装配置的mmdetection环境离线拷贝到另一台电脑
2020/10/15 Python
html5写一个BUI折叠菜单插件的实现方法
2019/09/11 HTML / CSS
美国家用电器和电子产品商店:Abt
2016/09/06 全球购物
施华洛世奇水晶荷兰官方网站:SWAROVSKI荷兰
2017/05/12 全球购物
保护环境倡议书范文
2014/05/13 职场文书
运动员口号
2014/06/09 职场文书
HR必备:超全面的薪酬待遇管理方案!
2019/07/12 职场文书
2019年作为一名实习生的述职报告
2019/09/29 职场文书
SQLServer2019 数据库的基本使用之图形化界面操作的实现
2021/04/08 SQL Server
python实现层次聚类的方法
2021/11/01 Python
《仙剑客栈2》第一弹正式宣传片公开 年内发售
2022/04/07 其他游戏
python数字图像处理之图像自动阈值分割示例
2022/06/28 Python