退化函数建模

  通过点扩散函数 PSF 进行图像复原的实验,添加适当的噪声。

  fspecial函数中,’motion’指的是运动模糊算子。

代码示例

% checkerboard产生测试板图像,第一个参数是每个正方形一边的像素数,第二个参数行数,第三为列数(缺省则等于行数)
f = checkerboard(8);                                     % 产生一个一面为8个正方形的测试板
PSF = fspecial('motion',7,45);                           % 运动模糊,PSF刚好为空间滤波器
gb = imfilter(f,PSF,'circular');                         % 减少边界效应
noise = imnoise(zeros(size(f)),'gaussian',0,0.001);      % 高斯噪声
g = gb + noise;                                          % 添加高斯噪声构造退化的图像模型subplot(2,2,1);imshow(pixeldup(f,8),[ ]);title('原图像'); % 大图像运算过慢,故选用小图像来节省时间,
subplot(2,2,2);imshow(gb);title('运动模糊图像');          % 以显示为目的,可通过像素赋值来放大图像。
subplot(2,2,3);imshow(noise,[ ]);title('高斯噪声图像');
subplot(2,2,4);imshow(g);title('运动模糊+高斯噪声');
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

运行结果


频域滤波降低周期噪声

  周期噪声本身表现为类似冲击的串,这种串在傅里叶频谱中通常是可见的。滤除这些成分的主要途径是通过陷波滤波。n阶巴特沃兹陷波滤波器的传递函数如下:


直接逆滤波


维纳滤波



代码示例

f = checkerboard(8);                                     % 产生一个一面为8个正方形的测试板
PSF = fspecial('motion',7,45);                           % 运动模糊,PSF刚好为空间滤波器
gb = imfilter(f,PSF,'circular');                         % 减少边界效应
noise = imnoise(zeros(size(f)),'gaussian',0,0.001);      % 高斯噪声
g = gb + noise;                                          % 添加高斯噪声构造退化的图像模型fr1 = deconvwnr(g,PSF);                                  % 直接逆滤波Sn = abs(fft(noise)).^2;                                 % 噪声功率谱
nA = sum(Sn(:))/prod(size(noise));                       % 平均噪声功率,prod计算数组元素的连乘积。
Sf = abs(fft2(f)).^2;                                    % 图像功率谱
fA = sum(Sf(:))/prod(size(f));                           % 平均图像功率
R = nA/fA;                                               % 噪信功率比
fr2 = deconvwnr(g,PSF,R);                                % 参数维纳滤波器NCORR = fftshift(real(ifft2(Sn)));                       % 自相关函数
ICORR = fftshift(real(ifft2(Sf)));
fr3 = deconvwnr(g,PSF,NCORR,ICORR);subplot(2,2,1);imshow(g,[]);title('噪声图像');
subplot(2,2,2);imshow(fr1);title('逆滤波结果');
subplot(2,2,3);imshow(fr2);title('使用常数比率的维纳滤波的结果');
subplot(2,2,4);imshow(fr3);title('使用自相关函数的维纳滤波的结果');
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

运行结果


正则滤波(约束的最小二乘方滤波)

算法另寻…

代码示例

f = checkerboard(8);                                     % 产生一个一面为8个正方形的测试板
PSF = fspecial('motion',7,45);                           % 运动模糊,PSF刚好为空间滤波器
gb = imfilter(f,PSF,'circular');                         % 减少边界效应
noise = imnoise(zeros(size(f)),'gaussian',0,0.001);      % 高斯噪声
g = gb + noise;                                          % 添加高斯噪声构造退化的图像模型fr1 = deconvreg(g,PSF,4);                                % 正则滤波器
fr2 = deconvreg(g,PSF,0.4,[1e-7 1e7]);subplot(1,3,1);imshow(g);title('运动模糊+高斯噪声(g)');
subplot(1,3,2);imshow(fr1);title('正则滤波器');
subplot(1,3,3);imshow(fr2);title('正则滤波器(缩小范围)');
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

运行结果


使用L-R算法的迭代非线性复原

  前面所讨论的图像复原方法都是线性的,而LR算法是非线性方法,又称Lucy-Richardson算法。

代码示例

f = checkerboard(8);                                % 产生64×64像素的方形图像
PSF = fspecial('gaussian',7,10);                    % 产生一个大小为7×7且标准偏差为10的高斯PSF
SD = 0.01;                                          % 标准偏差
g = imnoise(imfilter(f,PSF),'gaussian',0,SD^2);     % 添加均值为0、标准偏差为0.01的高斯噪声DAMPAR = 10*SD;                                     % 结果图像与原图像的偏离阈值
LIM = ceil(size(PSF,1)/2);
WEIGHT = zeros(size(g));                            % WEIGHT数组大小64×64
WEIGHT(LIM+1:end-LIM,LIM+1:end-LIM)=1;              % WEIGHT数组有值为0的4像素宽的边界,其余像素为1f1 = deconvlucy(g,PSF,5,DAMPAR,WEIGHT);             % 迭代5次
f2 = deconvlucy(g,PSF,10,DAMPAR,WEIGHT);            % 迭代10次
f3 = deconvlucy(g,PSF,20,DAMPAR,WEIGHT);            % 迭代20次
f4 = deconvlucy(g,PSF,100,DAMPAR,WEIGHT);           % 迭代100次subplot(2,3,1);imshow(pixeldup(f,8));title('原图像');
subplot(2,3,2);imshow(g);title('高斯噪声+运动模糊');
subplot(2,3,3);imshow(f1);title('L-R算法迭代5次');
subplot(2,3,4);imshow(f2);title('L-R算法迭代10次');  % 图像虽然改进,但依然模糊
subplot(2,3,5);imshow(f3);title('L-R算法迭代20次');  % 迭代20次为合理复原
subplot(2,3,6);imshow(f4);title('L-R算法迭代100次'); % 除了稍微清晰明亮,并无显著改进
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

运行结果


盲去卷积

  不以PSF知识为基础的图像复原方法统称为盲去卷积算法。

代码示例

PSF = fspecial('gaussian',7,10);
SD = 0.01;
g = imnoise(imfilter(f,PSF),'gaussian',0,SD^2);INITPSF = ones(size(PSF));                                              % 点扩散函数的初始估计
DAMPAR = 10*SD;                                                         % 结果图像与原图像的偏离阈值
LIM = ceil(size(PSF,1)/2);
WEIGHT = zeros(size(g));                                                % WEIGHT数组大小64×64
WEIGHT(LIM+1:end-LIM,LIM+1:end-LIM)=1;                                  % WEIGHT数组有值为0的4像素宽的边界,其余像素为1
[fr1,PSFe1] = deconvblind(g,INITPSF,5,DAMPAR,WEIGHT);                   % 盲去卷积迭代5次
[fr2,PSFe2] = deconvblind(g,INITPSF,10,DAMPAR,WEIGHT);                  % 盲去卷积迭代10次
[fr3,PSFe3] = deconvblind(g,INITPSF,20,DAMPAR,WEIGHT);                  % 盲去卷积迭代20次subplot(2,2,1);imshow(pixeldup(PSF,73),[ ]);title('退化函数的PSF');
subplot(2,2,2);imshow(pixeldup(PSFe1,73),[ ]);title('盲去卷积迭代5次');
subplot(2,2,3);imshow(pixeldup(PSFe2,73),[ ]);title('盲去卷积迭代10次');
subplot(2,2,4);imshow(pixeldup(PSFe3,73),[ ]);title('盲去卷积迭代20次'); % 最接近真正PSF
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

运行结果

【图像处理】MATLAB:退化函数及多种复原方法相关推荐

  1. 退化函数及多种复原方法【Matlab】

    退化函数建模   通过点扩散函数 PSF 进行图像复原的实验,添加适当的噪声.   fspecial函数中,'motion'指的是运动模糊算子. 代码示例 % checkerboard产生测试板图像, ...

  2. Matlab自定义函数的几种方法

    Matlab自定义函数的几种方法_czw-CSDN博客_matlab自定义函数 Matlab 定义函数的几种方法_海底小星星的博客-CSDN博客_matlab定义函数

  3. MATLAB中函数find的使用方法概述,简单易懂+例子

    MATLAB中函数find的使用方法总结+探索,简单易懂+例子 该函数不仅可以查找矩阵获这向量中的非零元素的位置,也可以查询满足一定逻辑条件的元素位置. find函数总共的适用方法 index = f ...

  4. 怎么调出matlab的函数,matlab定义函数【搞定方法】

    喜欢使用电脑的小伙伴们一般都会遇到win7系统matlab定义函数的问题,突然遇到win7系统matlab定义函数的问题就不知道该怎么办了,其实win7系统matlab定义函数的解决方法非常简单,按照 ...

  5. 命令行下使用matlab写函数,matlab定义函数【搞定方法】

    喜欢使用电脑的小伙伴们一般都会遇到win7系统matlab定义函数的问题,突然遇到win7系统matlab定义函数的问题就不知道该怎么办了,其实win7系统matlab定义函数的解决方法非常简单,按照 ...

  6. matlab分段函数的表达_【MATLAB】06_分段函数的多种表示方法

    目录 方法一:(一般方法) 方法二:(find) 方法三:(关系运算) 方法一:(一般方法) 按照正常的思路,表示分段函数是在脚本文件里用 if ..else..语句来完成,例如下列代码: funct ...

  7. Matlab自定义函数的五种方法

    n1.函数文件+调用命令文件:需单独定义一个自定义函数的M文件; n2.函数文件+子函数:定义一个具有多个自定义函数的M文件: n3.Inline:无需M文件,直接定义: n4.Syms+subs: ...

  8. Matlab 定义函数的几种方法

    1.函数文件+调用命令文件:需单独定义一个自定义函数的M文件 例:自定义求和函数 需要自定义一个 my_sum.m 的文件来存放函数 function[s]=my_sum(n) s=0; for i= ...

  9. matlab自定义函数的使用方法,Matlab自定义函数的几种方法

    1. 函数文件:定义.m文件 function y=myFun(x) y=x^2;以上是myFun.m文件,Matlab命令行使用: clear; clc; y=myFun(2); 2.inline方 ...

最新文章

  1. Postgres-XL部署记录(一)
  2. 安装phpMyAdmin图文教程
  3. SQL Server:移动系统数据库
  4. Vlan9.com论坛 2007-10-30精华技术文档
  5. Vue:vue中axios通过代理解决跨域
  6. 如何让sublime编译c语言,如何在Sublime Text 3中编译C程序?
  7. 关于SQL2005安装完毕后,没有SQL Server Management Studio问题的解决方法
  8. mac vs 返回上一步_Mac 上 VSCode常用快捷键
  9. iOS 加速计 摇一摇
  10. C语言编程--根据麦克劳林公式计算任意角的正弦余弦
  11. PDF转长图,用illustrator把PDF转长图,不需要代码
  12. 二进制逆向实验——寻找flag
  13. xv6 6.S081 Lab5: cow
  14. html页面宽度1920,网页banner尺寸1920
  15. 下载和安装Tcl/Tk:
  16. 五子棋游戏AI智能算法设计
  17. c++植树问题解决代码
  18. 读书笔记013:《伤寒论》- 足少阳胆经
  19. Day629.思考题解答① -Java业务开发常见错误
  20. 生财有术第六期开放:何以解忧,唯有实战

热门文章

  1. 轻松看懂java设计模式简单工厂模式
  2. 海量java等互联网相关电子图书分享
  3. svn教程----eclipse的SVN插件使用
  4. Java程序员到架构师的推荐阅读书籍
  5. Eclipse中JSP默认模板修改:设置编码为UTF-8以及导入JSTL等
  6. 双指针算法之滑动窗口 | 力扣76.最小覆盖字串
  7. 解决 VSCode 编写 C++11 代码报红问题
  8. 第八届蓝桥杯决赛 磁砖样式(枚举)
  9. c语言二元运算符大全,C语言运算符大全
  10. mysql通配符_mysql通配符进行模糊查询