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实现指定字符串补全空格的方法
Apr 30 Python
Python3实现从文件中读取指定行的方法
May 22 Python
Python实现简单登录验证
Apr 13 Python
Python3.5编程实现修改IIS WEB.CONFIG的方法示例
Aug 18 Python
Python获取当前函数名称方法实例分享
Jan 18 Python
linux安装Python3.4.2的操作方法
Sep 28 Python
python3 实现验证码图片切割的方法
Dec 07 Python
对Python 除法负数取商的取整方式详解
Dec 12 Python
python怎么对数字进行过滤
Jul 05 Python
Python 远程开关机的方法
Nov 18 Python
Python3爬虫RedisDump的安装步骤
Feb 20 Python
Python项目实战之使用Django框架实现支付宝付款功能
Feb 23 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网上调查系统
2006/10/09 PHP
win2003服务器使用WPS的COM组件的一些问题解决方法
2012/01/11 PHP
php empty()与isset()区别的详细介绍
2013/06/17 PHP
慎用preg_replace危险的/e修饰符(一句话后门常用)
2013/06/19 PHP
php一维二维数组键排序方法实例总结
2014/11/13 PHP
PHP实现JS中escape与unescape的方法
2016/07/11 PHP
PHP设计模式之工厂模式实例总结
2017/09/01 PHP
php+Ajax无刷新验证用户名操作实例详解
2019/03/04 PHP
Laravel手动返回错误码示例
2019/10/22 PHP
jQuery中wrapInner()方法用法实例
2015/01/16 Javascript
JS网页在线获取鼠标坐标值的方法
2015/02/28 Javascript
jQuery实现淡入淡出二级下拉导航菜单的方法
2015/08/28 Javascript
javascript每日必学之多态
2016/02/23 Javascript
详解Vue Elememt-UI构建管理后台
2018/02/27 Javascript
Element Input组件分析小结
2018/10/11 Javascript
Nodejs中怎么实现函数的串行执行
2019/03/02 NodeJs
js实现点击生成随机div
2020/01/16 Javascript
[05:49]2014DOTA2TI4正赛第二日综述 昔日冠军纷纷落马 VG LGD占尽先机
2014/07/20 DOTA
[36:19]2018DOTA2亚洲邀请赛 小组赛 A组加赛 Newbee vs LGD
2018/04/03 DOTA
Python 列表排序方法reverse、sort、sorted详解
2016/01/22 Python
Python基于回溯法子集树模板实现图的遍历功能示例
2017/09/05 Python
Python实现的将文件每一列写入列表功能示例【测试可用】
2018/03/19 Python
python3中获取文件当前绝对路径的两种方法
2018/04/26 Python
解决python gdal投影坐标系转换的问题
2020/01/17 Python
canvas与html5实现视频截图功能示例
2016/12/15 HTML / CSS
找到不普通的东西:Bonanza
2016/10/20 全球购物
丝芙兰香港官网:Sephora香港
2018/03/13 全球购物
安全生产承诺书
2014/03/26 职场文书
义务教育学校标准化建设汇报材料
2014/08/16 职场文书
群众路线教育实践活动实施方案
2014/10/31 职场文书
整改落实自查报告
2014/11/05 职场文书
大卫科波菲尔读书笔记
2015/06/30 职场文书
大学生,三分钟即兴演讲稿
2019/07/22 职场文书
一起来学习Python的元组和列表
2022/03/13 Python
ant design charts 获取后端接口数据展示
2022/05/25 Javascript
Python 操作pdf pdfplumber读取PDF写入Exce
2022/08/14 Python