1.逆滤波的问题点

      图像的老化,可以视为以下这样的一个过程。一个是退化函数的影响(致使图片模糊,褪色等),一个可加性噪声的影响。
用算式表示为 
    前几篇博文,主要是介绍可加性噪声的去除。本博文,主要介绍图像的逆滤波,即退化函数的去除。然而,逆滤波在空间域内的处理是很不方便的。
    简单的来考虑,加法的逆运算是减法,乘法的逆运算的除法,微分的逆运算是积分(严密一点说是不定积分)。那么就可以得到一个简单的结论了,要出去卷积的话,肯定需要用到卷积的逆运算。卷积的逆运算是---------反卷积,额,好像是一个理所应当的名字。 我们建立了一个关于卷积的直观认识,将信号反转与滤波器系数求积和。那么,反卷积是一种什么样的运算呢?或者具体的来讲,反卷积的空间运算表现形式是什么样的?这样的考虑其实是多余的,或者说,不用考虑的那么复杂。
    在之前的博文中([数字图像处理]频域滤波(1)--基础与低通滤波器),我们得到这样的一个重要的结论。空间域内的卷积,其实就是频域内的乘积。那么这么考虑,就非常简单了,频域内的逆滤波运算,其实就是做除法。我们通过傅里叶变换,可以得到如下一个频域内的老化模型。
    
这样一个表达式内,没有了卷积运算,是一个很简单的四则运算。那么,所谓的去卷积或者逆滤波,就是将退化函数去除的过程。这样看来的话,直接做除法就可以了,如下所示。
    按照教材上的说法,这个表达式很有趣(哪里有趣了?)。首先,必须知道精确的退化函数。其次,如果退化函数含有0值或者极小值的话,会使得噪声项变得极大。
    综上所述,其实逆滤波的问题点有两个:、
    1.退化函数的推测。
    2.尽可能的不让噪声项影响画质。
   

2.两个退化函数的模型

2.1 大气湍流模型

   这个模型很简单,与高斯LPF很相似。伴随着值的增大,得到的图像越来越模糊。以下是这个模型执行的结果。
从表示式上可以看出,这个模型是不会有0值的,不过,这个模型与低通滤波器很相似,阻带的值都是极小的。这可能会使得图像的直接逆滤波失败。这个之后再说。
    

2.2 运动模糊模型

     这个模型其实在Photoshop上也有一个同名的滤镜。详细的推倒我就不做了,这个模型的表达式如下所示。
这里有几个参数,说明一下。表示曝光时间,这里的表示了水平移动量与垂直移动量。值得一提的是,不要忘记下面这样一个重要的极限。

注意,运动模糊后的图像的尺寸会变化,如果还是按照原图截取,会造成图像成分的损失,在复原图像时候效果不是太好,而且不知道导致效果不好的原因,是由于成分的缺失,还是噪声的干扰。所以,这里我适当的扩展了图像的尺寸,以保留图像的所有成分
    此模型的执行结果如下所示。

3.图像的逆滤波

3.1 实验步骤与实验用图像

   我们是这样的一个实验步骤,首先,使用退化函数处理图像,然后加上适当的可加性噪声。使用这样的图像进行逆滤波实验。
   下面是实验用图像。图像的噪声选用的是高斯噪声,均值为0,方差为0.08。退化函数则选用先前叙述的两种,一个个大气湍流模型,一个是运动模糊。

3.2 直接逆滤波

    所谓直接逆滤波,就是不管噪声的影响,直接进行逆滤波的方法。
对于大气湍流模型而言,直接逆滤波会得到很不理想的结果。下面是直接逆滤波的实验结果。
     实验结果完全没有任何价值。观察其频谱,频谱的四角很亮,而原本频谱最亮的直流分量都看不到了。所以,这里做一个限制处理。也就是,仅仅只处理靠近直流分量的部分,其他的不做处理。然后处理完的结果,过一个10阶巴特沃斯低通滤波器。可以得到如下结果。
     这样的话,只需要调整限制半径,可以得到一个比之前较好的结果。当然,这招在运动模糊的图片面前,就略显得无力了。结果我就不贴了。

3.3 维纳滤波器

     维纳滤波器的推导,其实是个很复杂的过程。这里就不推导了,直接看结果,可以得到一些有用的结论。
观察式子,对于合适的常数,有如下两个结论。
1.对于退化函数很小的点,相对而言常数 的值很大,其倒数 不会太大。
2.对于退化函数很小的点,相对而言常数的值很小,其倒数 基本保持不变。
下面的维纳滤波器的实验结果:

3.4 约束最小二乘方滤波

    其实这个方法是一个很好的想法,将图像的能量作为评价图像平滑程度的度量,尽可能的将其平滑。设噪声的能量是一个定值,使用拉普拉斯未定系数法,将其进行迭代,然后解开。 这种方法有了很多的变种,包括很著名的TV(Total Variation,全变分)模型,这个我之后的博文会讲到。
    在这里,使用本方法的目的是,减少噪音对于逆滤波的影响。表达式如下所示。
这个滤波器,可以消除很严重的噪声,并且复原图像。将实验用图像的噪声的方差提升到0.2,再进行滤波,可以得到如下结果。

4 实验代码

close all;
clear all;
clc;
%% ----------init-----------------------------
f = imread('./original_DIP.tif');
f = mat2gray(f,[0 255]);
f_original = f;
[M,N] = size(f);
P = 2*M;
Q = 2*N;
fc = zeros(M,N);
for x = 1:1:M
for y = 1:1:N
fc(x,y) = f(x,y) * (-1)^(x+y);
end
end
F_I = fft2(fc,P,Q);
figure();
subplot(1,2,1);
imshow(f,[0 1]);
xlabel('a).Original Image');
subplot(1,2,2);
imshow(log(1 + abs(F_I)),[ ]);
xlabel('b).Fourier spectrum of a).');
%% ------motion blur------------------
H = zeros(P,Q);
a = 0.02;
b = 0.02;
T = 1;
for x = (-P/2):1:(P/2)-1
for y = (-Q/2):1:(Q/2)-1
R = (x*a + y*b)*pi;
if(R == 0)
H(x+(P/2)+1,y+(Q/2)+1) = T;
else H(x+(P/2)+1,y+(Q/2)+1) = (T/R)*(sin(R))*exp(-1i*R);
end
end
end
%% ------the atmospheric turbulence modle------------------
H_1 = zeros(P,Q);
k = 0.0025;
for x = (-P/2):1:(P/2)-1
for y = (-Q/2):1:(Q/2)-1
D = (x^2 + y^2)^(5/6);
D_0 = 60;
H_1(x+(P/2)+1,y+(Q/2)+1) = exp(-k*D);
end
end
%% -----------noise------------------
a = 0;
b = 0.2;
n_gaussian = a + b .* randn(M,N);
Noise = fft2(n_gaussian,P,Q);
figure();
subplot(1,2,1);
imshow(n_gaussian,[-1 1]);
xlabel('a).Gaussian noise');
subplot(1,2,2);
imshow(log(1 + abs(Noise)),[ ]);
xlabel('b).Fourier spectrum of a).');
%%
G = H .* F_I + Noise;
% G = H_1 .* F_I + Noise;
gc = ifft2(G);
gc = gc(1:1:M+27,1:1:N+27);
for x = 1:1:(M+27)
for y = 1:1:(N+27)
g(x,y) = gc(x,y) .* (-1)^(x+y);
end
end
gc = gc(1:1:M,1:1:N);
for x = 1:1:(M)
for y = 1:1:(N)
g(x,y) = gc(x,y) .* (-1)^(x+y);
end
end
figure();
subplot(1,2,1);
imshow(f,[0 1]);
xlabel('a).Original Image');
subplot(1,2,2);
imshow(log(1 + abs(F_I)),[ ]);
xlabel('b).Fourier spectrum of a).');
figure();
subplot(1,2,1);
imshow(abs(H),[ ]);
xlabel('c).The motion modle H(u,v)(a=0.02,b=0.02,T=1)');
subplot(1,2,2);
n = 1:1:P;
plot(n,abs(H(400,:)));
axis([0 P 0 1]);grid;
xlabel('H(n,400)');
ylabel('|H(u,v)|');
figure();
subplot(1,2,1);
imshow(real(g),[0 1]);
xlabel('d).Result image');
subplot(1,2,2);
imshow(log(1 + abs(G)),[ ]);
xlabel('e).Fourier spectrum of d). ');
%% --------------inverse_filtering---------------------
%F = G ./ H;
%F = G ./ H_1;
for x = (-P/2):1:(P/2)-1
for y = (-Q/2):1:(Q/2)-1
D = (x^2 + y^2)^(0.5);
if(D < 258)
F(x+(P/2)+1,y+(Q/2)+1) = G(x+(P/2)+1,y+(Q/2)+1) ./ H_1(x+(P/2)+1,y+(Q/2)+1);
% no noise D < 188
% noise D < 56
else F(x+(P/2)+1,y+(Q/2)+1) = G(x+(P/2)+1,y+(Q/2)+1);
end
end
end
% Butterworth_Lowpass_Filters
H_B = zeros(P,Q);
D_0 = 70;
for x = (-P/2):1:(P/2)-1
for y = (-Q/2):1:(Q/2)-1
D = (x^2 + y^2)^(0.5);
%if(D < 200) H_B(x+(P/2)+1,y+(Q/2)+1) = 1/(1+(D/D_0)^100);end
H_B(x+(P/2)+1,y+(Q/2)+1) = 1/(1+(D/D_0)^20);
end
end
F = F .* H_B;
f = real(ifft2(F));
f = f(1:1:M,1:1:N);
for x = 1:1:(M)
for y = 1:1:(N)
f(x,y) = f(x,y) * (-1)^(x+y);
end
end
%% ------show Result------------------
figure();
subplot(1,2,1);
imshow(f,[0 1]);
xlabel('a).Result image');
subplot(1,2,2);
imshow(log(1 + abs(F)),[ ]);
xlabel('b).Fourier spectrum of a).');
figure();
n = 1:1:P;
plot(n,abs(F(400,:)),'r-',n,abs(F(400,:)),'b-');
axis([0 P 0 1000]);grid;
xlabel('Number of rows(400th column)');
ylabel('Fourier amplitude spectrum');
legend('F_{limit}(u,v)','F(u,v)');
figure();
n = 1:1:P;
plot(n,abs(H(400,:)),'g-');
axis([0 P 0 1]);grid;
xlabel('H''_{s}(n,400)');
ylabel('|H''_{s}(u,v)|');
%% ----------Wiener filters-----------
% K = 0.000014;
K = 0.02;
%H_Wiener = ((abs(H_1).^2)./((abs(H_1).^2)+K)).*(1./H_1);
H_Wiener = ((abs(H).^2)./((abs(H).^2)+K)).*(1./H);
F_Wiener = H_Wiener .*  G;
f_Wiener = real(ifft2(F_Wiener));
f_Wiener = f_Wiener(1:1:M,1:1:N);
for x = 1:1:(M)
for y = 1:1:(N)
f_Wiener(x,y) = f_Wiener(x,y) * (-1)^(x+y);
end
end
[SSIM_Wiener mssim] = ssim_index(f_Wiener,f_original,[0.01 0.03],ones(8),1);
SSIM_Wiener
%% ------show Result------------------
figure();
subplot(1,2,1);
%imshow(f_Wiener(1:128,1:128),[0 1]);
imshow(f_Wiener,[0 1]);
xlabel('d).Result image by Wiener filter');
subplot(1,2,2);
imshow(log(1+abs(F_Wiener)),[ ]);
xlabel('c).Fourier spectrum of c).');
% subplot(1,2,2);
% %imshow(f(1:128,1:128),[0 1]);
% imshow(f,[0 1]);
% xlabel('e).Result image by inverse filter');
figure();
n = 1:1:P;
plot(n,abs(F(400,:)),'r-',n,abs(F_Wiener(400,:)),'b-');
axis([0 P 0 500]);grid;
xlabel('Number of rows(400th column)');
ylabel('Fourier amplitude spectrum');
legend('F(u,v)','F_{Wiener}(u,v)');
figure();
subplot(1,2,1);
imshow(log(1 + abs(H_Wiener)),[ ]);
xlabel('a).F_{Wiener}(u,v).');
subplot(1,2,2);
n = 1:1:P;
plot(n,abs(H_Wiener(400,:)));
axis([0 P 0 80]);grid;
xlabel('Number of rows(400th column)');
ylabel('Amplitude spectrum');
%% ------------Constrained_least_squares_filtering---------
p_laplacian = zeros(M,N);
Laplacian = [ 0 -1  0;
-1  4 -1;
0 -1  0];
p_laplacian(1:3,1:3) = Laplacian;
P = 2*M;
Q = 2*N;
for x = 1:1:M
for y = 1:1:N
p_laplacian(x,y) = p_laplacian(x,y) * (-1)^(x+y);
end
end
P_laplacian = fft2(p_laplacian,P,Q);
F_C = zeros(P,Q);
r = 0.2;
H_clsf = ((H')./((abs(H).^2)+r.*P_laplacian));
F_C = H_clsf .* G;
f_c = real(ifft2(F_C));
f_c = f_c(1:1:M,1:1:N);
for x = 1:1:(M)
for y = 1:1:(N)
f_c(x,y) = f_c(x,y) * (-1)^(x+y);
end
end
%%
figure();
subplot(1,2,1);
imshow(f_c,[0 1]);
xlabel('e).Result image by constrained least squares filter (r = 0.2)');
subplot(1,2,2);
imshow(log(1 + abs(F_C)),[ ]);
xlabel('f).Fourier spectrum of c).');
[SSIM_CLSF mssim] = ssim_index(f_c,f_original,[0.01 0.03],ones(8),1);
figure();
subplot(1,2,1);
imshow(log(1 + abs(H_clsf)),[ ]);
xlabel('a).F_{clsf}(u,v).');
subplot(1,2,2);
n = 1:1:P;
plot(n,abs(H_clsf(400,:)));
axis([0 P 0 80]);grid;
xlabel('Number of rows(400th column)');
ylabel('Amplitude spectrum');

原文发于博客:http://blog.csdn.net/thnh169/

=============更新日志===================

NULL

[数字图像处理]图像复原--逆滤波相关推荐

  1. 数字图像处理--傅里叶(逆)变换

    数字图像处理–傅里叶(逆)变换 主要内容 (1)对一副图像进行缩放,显示原始图像和缩放后的图像,分别对其进行傅里叶变换,显示变换后结果: (2)对一副图像进行旋转,显示原始图像和旋转后的图像,分别对其 ...

  2. 领域平均法matlab代码实验,数字图像处理邻域平均法滤波实验报告matlab实现.doc...

    数字图像处理邻域平均法滤波实验报告matlab实现 数字图像处理 实验报告 实验三 邻域平均法滤波 学号 姓名 实验三 邻域平均法滤波 一.实验内容 选取噪声较明显的图像,分别采用3*3.5*5.7* ...

  3. 数字图像处理之平滑滤波

    数字图像处理之平滑滤波                                          by方阳 版权声明:本文为博主原创文章,转载请标出转载地址 http://www.cnblog ...

  4. 数字图像处理实验(五)|图像复原{逆滤波和伪逆滤波、维纳滤波deconvwnr、大气湍流扰动模型、运动模糊处理fspecial}(附matlab实验代码和截图)

    文章目录 一.实验目的 二.实验仪器 三.实验原理 四.实验内容 1.逆滤波:选择MATLAB文件夹中的foggy图像作为实验图像. (1)生成退化函数: (2)复原 (a)直接逆滤波 (b)修正函数 ...

  5. matlab 数字图像滤波,数字图像处理 (基于Matlab) 滤波

    <数字图像处理> 实验报告 一.实验目的(不少于200字) 一.第一个实验用的是各种空间域的方式来滤波,也就是直接把图像和空间滤波器的模板做卷积,当 然图像处理很重要的一个部分还有频域的处 ...

  6. 数字图像处理-频率域滤波原理

    from:https://blog.csdn.net/forrest02/article/details/55510711?locationNum=15&fps=1 写在前面的话 作者是一名在 ...

  7. 数字图像处理之频域滤波

    前段时间看了很多的概念和知识,发现因为是走马观花的过了一遍,所以看得稀里糊涂的,然后许多地方混淆了概念,特别是关于图像频率域的部分的理解(包括图像频率域滤波之类的),所以下面总结一下这段时间重新看&l ...

  8. 系统学习数字图像处理之频域滤波

    最近在看模板匹配,虽然很简单,但还是想认真过下基础,因此把信号处理频域相关的内容,接着图像处理再过一遍. 理论上,对连续变量t的连续函数f(t)的傅里叶变换为F(u),利用f(t)取样后的函数重建f( ...

  9. 数字图像处理——中值滤波及其改进算法

    一.算法介绍 中值滤波器是非线性滤波器的一个例子,它在保留图像特征方面非常有效. 但是,滤波器的窗口大小直接影响中值滤波器的性能. 较小的窗口保留了特征,但会导致噪声抑制的减少. 在较大窗口的情况下, ...

最新文章

  1. 2016cocoapods安装流程及使用
  2. MongoDb Windows linux平台环境及主流编程语言驱动安装同时配置mongoDb的远程连接
  3. C++编程优化——让你的代码飞起来
  4. php大数组循环嵌套的性能优化
  5. Keras【Deep Learning With Python】实现多元线性回归
  6. hbm2java和hbm2ddl的使用步骤
  7. WIn10+Anaconda 环境下安装 PyTorch 避坑指南
  8. 鲲鹏云HCIA知识总结(一)
  9. scikit-learn 朴素贝叶斯类库使用小结
  10. 怎样查看.a和so文件中的接口
  11. Java 使用 Timer 进行调度
  12. 使用Xamarin开发手机聊天程序 -- 基础篇(大量图文讲解 step by step,附源码下载)
  13. JAVA之运算符优先级
  14. mysql5.1怎么备份,MySQL 5.1升级到MySQL 5.5的步骤
  15. 关于解决Codeblocks中文乱码问题
  16. scrapy 序列化写入器 ——ItemExporter
  17. python零基础8分钟基础入门
  18. C++_类和对象_C++运算符重载_左移运算符重载_链式编程_实现直接打印对象---C++语言工作笔记056
  19. html5 xml文本编辑,简介XML文档的阅读与编辑
  20. ascii码与键盘代码的区别

热门文章

  1. vivado生成bit流错误:Combinatorial Loop Alert
  2. Android-简单单词书app
  3. mong命令学习记录
  4. 微软开发的服务器简称,AAD Connect 微软官方的描述准确吗?
  5. linux 显卡 压力测试软件,显卡压力测试工具 GpuTest
  6. C语言练习题 :猴子吃桃程序
  7. GradCAM神经网络可视化解释(原理和实现)
  8. 动物识别系统代码python_动物识别系统代码
  9. 测量耐力也有算法了!仅需锻炼20分钟,就能知晓自己能跑多久
  10. 马斯克告诉推特员工:要么继续高强度工作,要么拿遣散费走人;微信新增删除声音锁功能;Deno 1.28 发布|极客头条