python实现逆滤波与维纳滤波示例

构建运动模糊模型

现假定相机不动,图像f(x,y)在图像面上移动并且图像f(x,y)除移动外不随时间变化。令x0(t)和y0(t)分别代表位移的x分量和y分量,那么在快门开启的时间T内,胶片上某点的总曝光量是图像在移动过程中一系列相应像素的亮度对该点作用之总和。也就是说,运动模糊图像是由同一图像在产生距离延迟后与原图像想叠加而成。如果快门开启与关闭的时间忽略不计,则有:

由于各种运动都是匀速直线运动的叠加,因而我们只需考虑匀速直线运动即可。但由于我们自身水平有限,且旨在探讨找到实现运动模糊复原方法的思想与方向,因而我们未能自行构建模型,而是借鉴了参考文献[1]中建立的运动模糊模型。关于本模型的理论依据参见参考文献[1].

下面我们描述一下该模型函数motion_process(image_size,motion_angle),它包含两个参数:图像的尺寸大小image_size以及运动的角度motion_angle。

例如,当运动位移为9、运动角度为45度时,则该模型函数的构建过程如下:

1. 首先是创建与图像同等大小的全0矩阵,然后找到全0矩阵的中心行数center_position,再计算出运动角度的tan值与cot值,算出运动的偏移量offset。

2. PSF[int(center_position+offset),int(center_position-offset)]=1

3. PSF[int(center_position-offset),int(center_position+offset)]=1

则该模型对应的图像如下图所示:

运动位移为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实现逆滤波与维纳滤波示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Python 基于FIR实现Hilbert滤波器求信号包络详解

    在通信领域,可以通过希尔伯特变换求解解析信号,进而求解窄带信号的包络. 实现希尔伯特变换有两种方法,一种是对信号做FFT,单后只保留单边频谱,在做IFFT,我们称之为频域方法:另一种是基于FIR根据传递函数设计一个希尔伯特滤波器,我们称之为时域方法. # -*- coding:utf8 -*- # @TIME : 2019/4/11 18:30 # @Author : SuHao # @File : hilberfilter.py import scipy.signal as signal im

  • Python实现中值滤波去噪方式

    中值滤波器去噪: 中值滤波的主要原理是将数字图像中的某点用该点的邻域中各个像素值的中值所来代替,这样就能让目标像素周围能够更好的接近真实值,比如一张白纸上有一个黑点时,黑点的像素值比较大,经过中值滤波过后,黑点附近的像素值可能就会变小.经过中值滤波后一些相对孤立的噪声点就容易被清除掉,这样就能提高图像的质量. 所以中值滤波器去噪的一个优点就是对椒盐噪声的去除具有很好的效果,具体操作是选取一个中心邻域,然后给邻域类各个像素的灰度值按大小进行排序,选取排序序列中的中值作为该邻域中心点的像素值的灰度值

  • Python利用FFT进行简单滤波的实现

    1.流程 大体流程如下,无论图像.声音.ADC数据都是如下流程: (1)将原信号进行FFT; (2)将进行FFT得到的数据去掉需要滤波的频率: (3)进行FFT逆变换得到信号数据: 2.算法仿真 2.1 生成数据: #采样点选择1400个,因为设置的信号频率分量最高为600Hz,根据采样定理知采样频率要大于信号频率2倍,所以这里设置采样频率为1400Hz(即一秒内有1400个采样点) x=np.linspace(0,1,1400) #设置需要采样的信号,频率分量有180,390和600 y=2*

  • python 经典数字滤波实例

    数字滤波分为 IIR 滤波,和FIR 滤波. FIR 滤波: import scipy.signal as signal import numpy as np import pylab as pl import matplotlib.pyplot as plt import matplotlib from scipy import signal b = signal.firwin(80, 0.5, window=('kaiser', 8)) w, h = signal.freqz(b) impo

  • opencv+python实现均值滤波

    本文实例为大家分享了opencv+python实现均值滤波的具体代码,供大家参考,具体内容如下 原理 均值滤波其实就是对目标像素及周边像素取平均值后再填回目标像素来实现滤波目的的方法,当滤波核的大小是3×3 3\times 33×3时,则取其自身和周围8个像素值的均值来代替当前像素值. 均值滤波也可以看成滤波核的值均为 1 的滤波. 优点:算法简单,计算速度快: 缺点:降低噪声的同时使图像产生模糊,特别是景物的边缘和细节部分. 代码 import cv2 as cv import numpy a

  • python实现逆滤波与维纳滤波示例

    构建运动模糊模型 现假定相机不动,图像f(x,y)在图像面上移动并且图像f(x,y)除移动外不随时间变化.令x0(t)和y0(t)分别代表位移的x分量和y分量,那么在快门开启的时间T内,胶片上某点的总曝光量是图像在移动过程中一系列相应像素的亮度对该点作用之总和.也就是说,运动模糊图像是由同一图像在产生距离延迟后与原图像想叠加而成.如果快门开启与关闭的时间忽略不计,则有: 由于各种运动都是匀速直线运动的叠加,因而我们只需考虑匀速直线运动即可.但由于我们自身水平有限,且旨在探讨找到实现运动模糊复原方

  • python实现逆序输出一个数字的示例讲解

    问题是:输入一个数字,按照指定要求逆序输出该数字,很简单,下面是实现: #!usr/bin/env python #encoding:utf-8 ''' __Author__:沂水寒城 功能:逆序输出一个数字 如果数字是正数直接输出如:177--->771 如果数字是负数保留负号如:-945--->-549 如果数字以0结果逆序后需要去除0如:100--->1 如果数字很大会造成溢出返回0即可 ''' def inverse_num(one_num): ''' 逆序输出一个数字 '''

  • python中实现词云图的示例

    import matplotlib.pyplot as plt import jieba from wordcloud import wordcloud # 1.读出词语 text = open('text/test.txt', 'r', encoding='utf-8').read() print(text) # 2.把歌词剪开 cut_text = jieba.cut(text) # print(type(cut_text)) # print(next(cut_text)) # print(

  • python实现三阶魔方还原的示例代码

    思路 复原魔方困难问题的分解: ​ 1.用合适的数据结构表示出三阶魔方的六个面以及每一面的颜色 ​ 2.每一次不同旋转操作的实现 ​ 3.复原时如何判断当前魔方应该使用哪一种公式 本次实验实现了前两个操作,具体思路是: 用numpy库中的矩阵将六个面分别表示出来,按上下左右前后的顺序放入列表中.再依据流行公式里的方法编写对每一个面进行旋转操作的函数,调用函数实现魔方的旋转.最后输入指令可得到旋转之后的魔方,以及执行逆序指令后验证魔方还原. 预备知识 矩阵:使用numpy库中的矩阵结构 函数说明:

  • Python实现二叉排序树与平衡二叉树的示例代码

    目录 前言 1. 二叉排序树 1.1 构建一棵二叉排序树 1.2 二叉排序树的数据结构 1.3 实现二叉排序树类中的方法: 2. 平衡二叉排序树 2.1 二叉平衡排序树的数据结构 3. 总结 前言 什么是树表查询? 借助具有特殊性质的树数据结构进行关键字查找. 本文所涉及到的特殊结构性质的树包括: 二叉排序树. 平衡二叉树. 使用上述树结构存储数据时,因其本身对结点之间的关系以及顺序有特殊要求,也得益于这种限制,在查询某一个结点时会带来性能上的优势和操作上的方便. 树表查询属于动态查找算法. 所

  • Python实现数字图像处理染色体计数示例

    目录 一.实验内容 二.实验步骤 三.代码 四.结果 一.实验内容 对于下面这幅图像,编程实现染色体计数,并附简要处理流程说明. 二.实验步骤 1.中值滤波 2.图像二值化 3.膨胀图像 4.腐蚀图像 5.计算光影背景 6.移除背景 7.检测染色体 三.代码 import cv2 import numpy as np # 计算光影背景 def calculateLightPattern(img4): h, w = img4.shape[0], img4.shape[1] img5 = cv2.b

  • python进阶collections标准库使用示例详解

    目录 前言 namedtuple namedtuple的由来 namedtuple的格式 namedtuple声明以及实例化 namedtuple的方法和属性 OrderedDict popitem(last=True) move_to_end(key, last=True) 支持reversed 相等测试敏感 defaultdict 小例子1 小例子2 小例子3 Counter对象 创建方式 elements() most_common([n]) 应用场景 deque([iterable[,

  • python编程羊车门问题代码示例

    问题: 有3扇关闭的门,一扇门后面停着汽车,其余门后是山羊,只有主持人知道每扇门后面是什么.参赛者可以选择一扇门,在开启它之前,主持人会开启另外一扇门,露出门后的山羊,然后允许参赛者更换自己的选择. 请问: 1.按照你的第一感觉回答,你觉得不换选择能有更高的几率获得汽车,还是换选择能有更高的几率获得汽车?或几率没有发生变化? 答:第一感觉换与不换获奖几率没有发生变化. 2.请自己认真分析一下"不换选择能有更高的几率获得汽车,还是换选择能有更高的几率获得汽车?或几率没有发生变化?" 写出

  • python实现逆波兰计算表达式实例详解

    本文实例讲述了python实现逆波兰计算表达式的方法.分享给大家供大家参考.具体分析如下: 逆波兰表达式又叫做后缀表达式.在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,所以,这种表示法也称为中缀表示.波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的方法.按此方法,每一运算符都置于其运算对象之后,故称为后缀表示. # -*- coding: utf-8 -*- symbol_priority = {} symbol_priority[0] = ['#']

  • Java编程实现逆波兰表达式代码示例

    逆波兰表达式 定义:传统的四则运算被称作是中缀表达式,即运算符实在两个运算对象之间的.逆波兰表达式被称作是后缀表达式,表达式实在运算对象的后面. 逆波兰表达式: a+b ---> a,b,+ a+(b-c) ---> a,b,c,-,+ a+(b-c)*d ---> a,b,c,-,d,*,+ a+d*(b-c)--->a,d,b,c,-,*,+ a=1+3 ---> a=1,3 + http=(smtp+http+telnet)/1024 写成什么呢? http=smtp,

随机推荐