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 相关文章推荐
wxpython学习笔记(推荐查看)
Jun 09 Python
深入理解Python 代码优化详解
Oct 27 Python
python绘制双柱形图代码实例
Dec 14 Python
centos 安装python3.6环境并配置虚拟环境的详细教程
Feb 22 Python
python traceback捕获并打印异常的方法
Aug 31 Python
使用numba对Python运算加速的方法
Oct 15 Python
Python/Django后端使用PIL Image生成头像缩略图
Apr 30 Python
pycharm debug 断点调试心得分享
Apr 16 Python
Python 批量下载阴阳师网站壁纸
May 19 Python
整理Python中常用的conda命令操作
Jun 15 Python
python微信智能AI机器人实现多种支付方式
Apr 12 Python
Python中使用tkFileDialog实现文件选择、保存和路径选择
May 20 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&amp;java(二)
2006/10/09 PHP
php xml文件操作实现代码(二)
2009/03/20 PHP
在PHP中使用curl_init函数的说明
2010/11/02 PHP
一个php生成16位随机数的代码(两种方法)
2014/09/16 PHP
nodejs 后缀名判断限制代码
2011/03/31 NodeJs
说说JSON和JSONP 也许你会豁然开朗
2012/09/02 Javascript
js触发select onchange事件的小技巧
2014/08/05 Javascript
JavaScript代码复用模式详解
2014/11/07 Javascript
jQuery动画效果相关方法实例分析
2015/12/31 Javascript
JavaScript获取对象在页面中位置坐标的方法
2016/02/03 Javascript
JavaScript中匿名函数的用法及优缺点详解
2016/06/01 Javascript
js放到head中失效的原因与解决方法
2017/03/07 Javascript
jQuery实现腾讯信用界面(自制刻度尺)样式
2017/08/15 jQuery
js禁止Backspace键使浏览器后退的实现方法
2017/09/01 Javascript
Three.js加载外部模型的教程详解
2017/11/10 Javascript
VUE2.0+Element-UI+Echarts封装的组件实例
2018/03/02 Javascript
Vue入门之animate过渡动画效果
2018/04/08 Javascript
微信小程序wx.uploadfile 本地文件转base64的实现代码
2018/06/28 Javascript
微信小程序实现点赞、取消点赞功能
2018/11/02 Javascript
[02:42]完美大师赛主赛事淘汰赛第三日观众采访
2017/11/25 DOTA
Python存取XML的常见方法实例分析
2017/03/21 Python
python3.x实现base64加密和解密
2019/03/28 Python
解决yum对python依赖版本问题
2019/07/05 Python
Python开发企业微信机器人每天定时发消息实例
2020/03/17 Python
解决Python 函数声明先后顺序出现的问题
2020/09/02 Python
Scrapy实现模拟登录的示例代码
2021/02/21 Python
美国家居装饰网上商店:Lulu & Georgia
2019/09/14 全球购物
实习生单位鉴定意见
2013/12/04 职场文书
关于读书的演讲稿400字
2014/08/27 职场文书
2014年小学辅导员工作总结
2014/12/23 职场文书
2015年施工员工作总结范文
2015/04/20 职场文书
2015秋季幼儿园开学通知
2015/07/16 职场文书
运动会通讯稿100字
2015/07/20 职场文书
《窃读记》教学反思
2016/02/18 职场文书
2019通用版新员工入职培训方案!
2019/07/11 职场文书
Oracle中update和select 关联操作
2022/01/18 Oracle