图像去模糊(逆滤波)
来源:互联网 发布:淘宝外卖粮票口令分享 编辑:程序博客网 时间:2024/05/16 05:32
引言
图像模糊是一种拍摄常见的现象,我曾在图像去模糊(维纳滤波) 介绍过。这里不再详述,只给出物理模型,这里我们仍在频率域表示
其中提到最简单的复原方法是直接做逆滤波(Inverse filter)。
该除法是阵列操作,即按位除。
在含有噪声情况下,将(1)式两端除以
这里
下面我将用代码说明一下逆滤波,这里我采用直接编码形式。对了,前面我提到过,当噪声信息比
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,图像复原与重建
转载请保留以下信息
0 0
- 图像去模糊(逆滤波)
- 图像去模糊(逆滤波)
- 图像去模糊(逆滤波)
- 基于逆滤波的图像去模糊
- 图像去模糊(维纳滤波)
- 图像去模糊(约束最小二乘方滤波)
- 图像去模糊(约束最小二乘方滤波)
- 基于最小均方差(维纳)滤波的图像去模糊
- 图像平滑、滤波、模糊
- 图像去模糊
- 【转】图像去模糊
- 图像的去模糊
- 图像模糊--快速均值滤波
- 图像模糊--高斯滤波
- 图像去模糊(一)——理解模糊核
- 克服维纳滤波去运动模糊后图像中出现的白点
- 高斯(Guassian)模糊 图像滤波 基本原理介绍
- 基于模糊滤波的数字图像去噪
- 移植u-boot到mini2440--初始化代码分析
- Android优雅地实现夜间模式
- FPGA第八篇:运算符、赋值语句和结构说明语句
- 静态代理
- 最近使用ut的一些体会
- 图像去模糊(逆滤波)
- SPOJ 694 Distinct Substrings(后缀数组)
- Android 获取内外置存储卡方法
- 基于webmagic的爬虫小应用--爬取知乎用户信息
- Android App 内存泄露之Handler
- 理学与心学的比较
- Dropping Balls, UVa679
- 怎样快速学会ZBrush 中的移动笔刷的运用
- 十六、适配器模式Adapter(结构型模式)