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基础教程之字典操作详解
Mar 25 Python
Python多线程编程(二):启动线程的两种方法
Apr 05 Python
Python实现栈的方法
May 26 Python
在CentOS上配置Nginx+Gunicorn+Python+Flask环境的教程
Jun 07 Python
解读python logging模块的使用方法
Apr 17 Python
对python中使用requests模块参数编码的不同处理方法
May 18 Python
django如何连接已存在数据的数据库
Aug 14 Python
解决python 自动安装缺少模块的问题
Oct 22 Python
Python实现字典排序、按照list中字典的某个key排序的方法示例
Dec 18 Python
使用Fabric自动化部署Django项目的实现
Sep 27 Python
flask的orm框架SQLAlchemy查询实现解析
Dec 12 Python
python 发送get请求接口详解
Nov 17 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 采集程序中常用的函数
2009/12/09 PHP
php数据库连接时容易出错的特殊符号问题
2010/09/01 PHP
Php中使用Select 查询语句的实例
2014/02/19 PHP
Linux(CentOS)下PHP扩展PDO编译安装的方法
2016/04/07 PHP
详谈PHP面向对象中常用的关键字和魔术方法
2017/02/04 PHP
tp5 实现列表数据根据状态排序
2019/10/18 PHP
jQuery select控制插件
2009/08/17 Javascript
JAVASCRIPT实现的WEB页面跳转以及页面间传值方法
2010/05/13 Javascript
JS截取url中问号后面参数的值信息
2014/04/29 Javascript
javascript中createElement的两种创建方式
2015/05/14 Javascript
Javascript的表单验证-揭开正则表达式的面纱
2016/03/18 Javascript
VUE实现日历组件功能
2017/03/13 Javascript
angular.js+node.js实现下载图片处理详解
2017/03/31 Javascript
JavaScript正则表达式简单实用实例
2017/06/23 Javascript
Mac下安装vue
2018/04/11 Javascript
vue-cli3.0使用及部分配置详解
2018/08/29 Javascript
傻瓜式vuex语法糖kiss-vuex整理
2018/12/21 Javascript
如何基于原生javaScript生成带图片的二维码
2019/11/21 Javascript
vue页面加载时的进度条功能(实例代码)
2020/01/13 Javascript
jQuery HTML设置内容和属性操作实例分析
2020/05/20 jQuery
python实现目录树生成示例
2014/03/28 Python
python的dataframe和matrix的互换方法
2018/04/11 Python
Python开发网站目录扫描器的实现
2019/02/21 Python
python创建与遍历List二维列表的方法
2019/08/16 Python
python 字典访问的三种方法小结
2019/12/05 Python
Python字符串格式化常用手段及注意事项
2020/06/17 Python
Python爬虫爬取博客实现可视化过程解析
2020/06/29 Python
Python生成并下载文件后端代码实例
2020/08/31 Python
Myprotein亚太地区:欧洲第一在线运动营养品牌
2020/12/20 全球购物
什么是托管函数?托管函数有什么用?
2014/06/15 面试题
商务日语毕业生自荐信范文
2013/11/14 职场文书
行政专员岗位职责
2014/01/02 职场文书
车间统计员岗位职责
2014/01/05 职场文书
2014年挂职干部工作总结
2014/12/06 职场文书
python使用BeautifulSoup 解析HTML
2022/04/24 Python