引言

图像模糊是一种拍摄常见的现象,我曾在图像去模糊(维纳滤波) 介绍过。这里不再详述,只给出物理模型,这里我们仍在频率域表示

G(u,v)=H(u,v)F(u,v)+N(u,v)(1)

其中提到最简单的复原方法是直接做逆滤波(Inverse filter)。

F̂ (u,v)=G(u,v)H(u,v)(2)

该除法是阵列操作,即按位除。 
在含有噪声情况下,将(1)式两端除以H(u,v)

F̂ (u,v)=F(u,v)+N(u,v)H(u,v)(3)

这里N(u,v)未知,式子表明,即使知道退化函数也不能准备复原图像。还有当退化函数H(u,v)是零或者非常小的值,则N(u,v)H(u,v)很容易支配整个式子。 
下面我将用代码说明一下逆滤波,这里我采用直接编码形式。对了,前面我提到过,当噪声信息比NSR等于0时,此时维娜滤波等同于逆滤波。因此可以直接使用matlab自带deconvwnr函数,将第三个参数NSR设置成0即可,省事的同学可以试一下。

代码

<code class="hljs vhdl has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">close <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">all</span>;
clear <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">all</span>;
clc;
% Display the original image.
I = im2double(imread(<span class="hljs-attribute" style="box-sizing: border-box;">'lena</span>.jpg'));
[hei,wid,~] = size(I);
subplot(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>),imshow(I);
title(<span class="hljs-attribute" style="box-sizing: border-box;">'Original</span> Image (courtesy <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">of</span> MIT)');% Simulate a motion blur.
LEN = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">21</span>;
THETA = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">11</span>;
PSF = fspecial(<span class="hljs-attribute" style="box-sizing: border-box;">'motion</span>', LEN, THETA);
blurred = imfilter(I, PSF, <span class="hljs-attribute" style="box-sizing: border-box;">'conv</span>', <span class="hljs-attribute" style="box-sizing: border-box;">'circular</span>');
subplot(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>), imshow(blurred); title(<span class="hljs-attribute" style="box-sizing: border-box;">'Blurred</span> Image');% Inverse filter
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">If</span> = fft2(blurred);
Pf = fft2(PSF,hei,wid);
deblurred = ifft2(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">If</span>./Pf);
subplot(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>), imshow(deblurred); title(<span class="hljs-attribute" style="box-sizing: border-box;">'Restore</span> Image')% Simulate additive noise.
noise_mean = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
noise_var = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.0001</span>;
blurred_noisy = imnoise(blurred, <span class="hljs-attribute" style="box-sizing: border-box;">'gaussian</span>', ...noise_mean, noise_var);
subplot(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span>), imshow(blurred_noisy)
title(<span class="hljs-attribute" style="box-sizing: border-box;">'Simulate</span> Blur <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">and</span> Noise')% Try restoration assuming no noise.
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">If</span> = fft2(blurred_noisy);
deblurred2 = ifft2(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">If</span>./Pf);
subplot(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>), imshow(deblurred2)
title(<span class="hljs-attribute" style="box-sizing: border-box;">'Restoration</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">of</span> Blurred Assuming No Noise');% Try restoration <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">with</span> noise <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">is</span> known.
noisy = blurred_noisy - blurred;
Nf = fft2(noisy);
deblurred2 = ifft2(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">If</span>./Pf - Nf./Pf);
subplot(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6</span>), imshow(deblurred2)
title(<span class="hljs-attribute" style="box-sizing: border-box;">'Restoration</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">of</span> Blurred <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">with</span> Noise <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Is</span> Known')</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li></ul>

这里使用了经典的lena图是灰度图像,分别对图像进行运动模糊,逆滤波,运动模糊+高斯噪声,假定噪声未知直接逆滤波,噪声已知逆滤波。

效果

说明

逆滤波对噪声非常敏感,除非我们知道噪声的分布情况(事实上,这也很难知道),逆滤波几乎不可用,可以从二排中间看出,恢复图像效果极差。但若知道噪声分布,也是可以完全复原信息的。可以从二排最后一张图可以看出。写作本文的目的也仅是在数学角度上对图像模糊现象进行分析,后续会介绍更加有效的图像复原方法,敬请关注。

相关阅读及参考文献

图像去模糊(维纳滤波) http://blog.csdn.net/bluecol/article/details/46242355 
图像去模糊(约束最小二乘滤波) http://blog.csdn.net/bluecol/article/details/47359421 
数字图像处理(第三版) 冈萨雷斯著 chapter 5,图像复原与重建

转载请保留以下信息

作者 日期 联系方式
风吹夏天 2015年8月8日 wincoder@qq.com

图像去模糊(逆滤波)相关推荐

  1. opencv图像恢复逆滤波_OpenCV之快速的图像边缘滤波算法

    python代码: import cv2 as cv import numpy as npsrc = cv.imread("./test.png") cv.namedWindow( ...

  2. 4.3 Python图像处理之图像恢复-无约束滤波器(逆滤波)、有约束滤波器(维纳滤波器)

    4.3 Python图像处理之图像恢复-无约束滤波器(逆滤波).有约束滤波器(维纳滤波器) 文章目录 4.3 Python图像处理之图像恢复-无约束滤波器(逆滤波).有约束滤波器(维纳滤波器) 1 算 ...

  3. 视频图像去模糊常用处理方法

    视频图像去模糊常用处理方法 随着"平安城市"的广泛建设,各大城市已经建有大量的视频监控系统,虽然监控系统己经广泛地存在于银行.商场.车站和交通路口等公共场所,但是在公安工作中,由于 ...

  4. 图像处理之仿真运动模糊复原【使用逆滤波、维纳滤波】

    目录 一.基础知识 二.问题分析 三.效果图 四.代码 一.基础知识 图像去模糊是一个经典的图像复原任务.造成图像模糊的原因有很多,可以主要分为三大类 离焦模糊:场景中的物体处于成像景深范围之外而变得 ...

  5. paper 89:视频图像去模糊常用处理方法

    随着"平安城市"的广泛建设,各大城市已经建有大量的视频监控系统,虽然监控系统己经广泛地存在于银行.商场.车站和交通路口等公共场所,但是在公安工作中,由于设备或者其他条件的限制,案情 ...

  6. [数字图像处理]图像复原--逆滤波

    1.逆滤波的问题点       图像的老化,可以视为以下这样的一个过程.一个是退化函数的影响(致使图片模糊,褪色等),一个可加性噪声的影响. 用算式表示为      前几篇博文,主要是介绍可加性噪声的 ...

  7. 图象恢复——(逆滤波,维纳滤波)

    目的:对获取图像在频域用高斯函数进行退化并叠加白噪声,对退化图像进行逆滤波和维纳滤波恢复,比较原始图像和恢复图像,对利用逆滤波和维纳滤波恢复方法恢复图像进行比较. 一.基本原理 图像复原是一种客观的操 ...

  8. 图像处理/计算机视觉/ python环境下如何用滤波器(/逆滤波/均值滤波/低通滤波/高通滤波)处理图片【附代码】

    计算机视觉滤波器实操 基础知识 一. 计算机视觉技术中常见的几种滤波器 二.滤波器相关知识 应用一:算术均值.几何均值.谐波逆谐波 一.问题分析 二.结果图 三.代码附录 应用二:维纳滤波,逆滤波 一 ...

  9. 数字图像处理4:逆滤波及其变形和维纳滤波

    逆滤波和维纳滤波 简介 在图像的获取.传输以及记录保存过程中,由于各种因素,如成像设备与目标物体的相对运动,大气的湍流效应,光学系统的相差,成像系统的非线性畸变,环境的随机噪声等原因都会使图像产生一定 ...

最新文章

  1. javax消息队列_Java面试—消息队列
  2. 阿里云研究员叔同:云原生是企业数字创新的最短路径
  3. 响应已被截断_技术:RWD响应式网站网页设计基本原则
  4. 九度OJ 1133:学分绩点 (加权平均数)
  5. STM32平台SD卡的FatFS文件系统开发
  6. 【备忘录】UTM坐标系与经纬度转换 MATLAB C语言
  7. z变换解差分方程例题_Z变换及差分方程求解.doc
  8. linux命令mvn,Linux下使用mvn命令(maven)
  9. 黑莓7290中文系统下载_无法将Blackberry 7290升级到最新的系统软件
  10. 433M、2.4G无线模块
  11. 我心中的超短系统之人气、情绪、大局观、仓控
  12. React Suspense 尝鲜
  13. Latex输入分段函数
  14. Nextcloud基本使用方法
  15. 国家开放大学2021春1133文献检索题目
  16. 电信显示isp服务器超时连不上,wifi连接超时怎么解决,网络能连上但连接超时-
  17. Ubuntu下python3卸载
  18. CurvySplines01(一条路径使用两个材质球)
  19. android弹出确认对话点击取消,Android点击返回按钮弹出确认消息对话框
  20. C/C++ #include详解

热门文章

  1. 星之卡比镜之迷宫机器人_迷宫武器盘点 | 是兄弟,就拿大宝剑砍我!
  2. php文章远程图片,php保存远程图片到本地 php正则匹配文章中的远程图片地址
  3. 失效日期 软件测试案例_软件异常测试经验总结(精)
  4. 香蕉派安装64位linux,在香蕉派里安装配置archlinux到树莓派
  5. javascript之原型与原型链
  6. python|selenium的API说明文档查看的2种方法
  7. FastDFS蛋疼的集群和负载均衡(十五)之lvs四层+Nginx七层负载均衡
  8. python编程分析了一下高考那些事,发现了两个之最,原来是这样
  9. 【leetcode】581. Shortest Unsorted Continuous Subarray
  10. 为什么道理都懂,却还是一事无成