逆滤波

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 实验代码


   
   
  1. close all;
  2. clear all;
  3. clc;
  4. %% ----------init-----------------------------
  5. f = imread( './original_DIP.tif');
  6. f = mat2gray(f,[ 0 255]);
  7. f_original = f;
  8. [M,N] = size(f);
  9. P = 2*M;
  10. Q = 2*N;
  11. fc = zeros(M,N);
  12. for x = 1: 1:M
  13. for y = 1: 1:N
  14. fc( x, y) = f( x, y) * (- 1)^( x+ y);
  15. end
  16. end
  17. F_I = fft2(fc,P,Q);
  18. figure();
  19. subplot( 1, 2, 1);
  20. imshow(f,[ 0 1]);
  21. xlabel( 'a).Original Image');
  22. subplot( 1, 2, 2);
  23. imshow( log( 1 + abs(F_I)),[ ]);
  24. xlabel( 'b).Fourier spectrum of a).');
  25. %% ------motion blur------------------
  26. H = zeros(P,Q);
  27. a = 0. 02;
  28. b = 0. 02;
  29. T = 1;
  30. for x = (-P/ 2): 1:(P/ 2)- 1
  31. for y = (-Q/ 2): 1:(Q/ 2)- 1
  32. R = ( x*a + y*b)*pi;
  33. if(R == 0)
  34. H( x+(P/ 2)+ 1, y+(Q/ 2)+ 1) = T;
  35. else H( x+(P/ 2)+ 1, y+(Q/ 2)+ 1) = (T/R)*( sin(R))* exp(- 1i*R);
  36. end
  37. end
  38. end
  39. %% ------the atmospheric turbulence modle------------------
  40. H_1 = zeros(P,Q);
  41. k = 0. 0025;
  42. for x = (-P/ 2): 1:(P/ 2)- 1
  43. for y = (-Q/ 2): 1:(Q/ 2)- 1
  44. D = ( x^ 2 + y^ 2)^( 5/ 6);
  45. D_ 0 = 60;
  46. H_1( x+(P/ 2)+ 1, y+(Q/ 2)+ 1) = exp(-k*D);
  47. end
  48. end
  49. %% -----------noise------------------
  50. a = 0;
  51. b = 0. 2;
  52. n_gaussian = a + b .* randn(M,N);
  53. Noise = fft2(n_gaussian,P,Q);
  54. figure();
  55. subplot( 1, 2, 1);
  56. imshow(n_gaussian,[- 1 1]);
  57. xlabel( 'a).Gaussian noise');
  58. subplot( 1, 2, 2);
  59. imshow( log( 1 + abs(Noise)),[ ]);
  60. xlabel( 'b).Fourier spectrum of a).');
  61. %%
  62. G = H .* F_I + Noise;
  63. % G = H_1 .* F_I + Noise;
  64. gc = ifft2(G);
  65. gc = gc( 1: 1:M+ 27, 1: 1:N+ 27);
  66. for x = 1: 1:(M+ 27)
  67. for y = 1: 1:(N+ 27)
  68. g( x, y) = gc( x, y) .* (- 1)^( x+ y);
  69. end
  70. end
  71. gc = gc( 1: 1:M, 1: 1:N);
  72. for x = 1: 1:(M)
  73. for y = 1: 1:(N)
  74. g( x, y) = gc( x, y) .* (- 1)^( x+ y);
  75. end
  76. end
  77. figure();
  78. subplot( 1, 2, 1);
  79. imshow(f,[ 0 1]);
  80. xlabel( 'a).Original Image');
  81. subplot( 1, 2, 2);
  82. imshow( log( 1 + abs(F_I)),[ ]);
  83. xlabel( 'b).Fourier spectrum of a).');
  84. figure();
  85. subplot( 1, 2, 1);
  86. imshow( abs(H),[ ]);
  87. xlabel( 'c).The motion modle H(u,v)(a=0.02,b=0.02,T=1)');
  88. subplot( 1, 2, 2);
  89. n = 1: 1:P;
  90. plot(n, abs(H( 400,:)));
  91. axis([ 0 P 0 1]);grid;
  92. xlabel( 'H(n,400)');
  93. ylabel( '|H(u,v)|');
  94. figure();
  95. subplot( 1, 2, 1);
  96. imshow(real(g),[ 0 1]);
  97. xlabel( 'd).Result image');
  98. subplot( 1, 2, 2);
  99. imshow( log( 1 + abs(G)),[ ]);
  100. xlabel( 'e).Fourier spectrum of d). ');
  101. %% --------------inverse_filtering---------------------
  102. %F = G ./ H;
  103. %F = G ./ H_1;
  104. for x = (-P/ 2): 1:(P/ 2)- 1
  105. for y = (-Q/ 2): 1:(Q/ 2)- 1
  106. D = ( x^ 2 + y^ 2)^( 0. 5);
  107. if(D < 258)
  108. 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);
  109. % no noise D < 188
  110. % noise D < 56
  111. else F( x+(P/ 2)+ 1, y+(Q/ 2)+ 1) = G( x+(P/ 2)+ 1, y+(Q/ 2)+ 1);
  112. end
  113. end
  114. end
  115. % Butterworth_Lowpass_Filters
  116. H_B = zeros(P,Q);
  117. D_ 0 = 70;
  118. for x = (-P/ 2): 1:(P/ 2)- 1
  119. for y = (-Q/ 2): 1:(Q/ 2)- 1
  120. D = ( x^ 2 + y^ 2)^( 0. 5);
  121. %if(D < 200) H_B( x+(P/ 2)+ 1, y+(Q/ 2)+ 1) = 1/( 1+(D/D_ 0)^ 100);end
  122. H_B( x+(P/ 2)+ 1, y+(Q/ 2)+ 1) = 1/( 1+(D/D_ 0)^ 20);
  123. end
  124. end
  125. F = F .* H_B;
  126. f = real(ifft2(F));
  127. f = f( 1: 1:M, 1: 1:N);
  128. for x = 1: 1:(M)
  129. for y = 1: 1:(N)
  130. f( x, y) = f( x, y) * (- 1)^( x+ y);
  131. end
  132. end
  133. %% ------show Result------------------
  134. figure();
  135. subplot( 1, 2, 1);
  136. imshow(f,[ 0 1]);
  137. xlabel( 'a).Result image');
  138. subplot( 1, 2, 2);
  139. imshow( log( 1 + abs(F)),[ ]);
  140. xlabel( 'b).Fourier spectrum of a).');
  141. figure();
  142. n = 1: 1:P;
  143. plot(n, abs(F( 400,:)), 'r-',n, abs(F( 400,:)), 'b-');
  144. axis([ 0 P 0 1000]);grid;
  145. xlabel( 'Number of rows(400th column)');
  146. ylabel( 'Fourier amplitude spectrum');
  147. legend( 'F_{limit}(u,v)', 'F(u,v)');
  148. figure();
  149. n = 1: 1:P;
  150. plot(n, abs(H( 400,:)), 'g-');
  151. axis([ 0 P 0 1]);grid;
  152. xlabel( 'H' '_{s}(n,400)');
  153. ylabel( '|H' '_{s}(u,v)|');
  154. %% ----------Wiener filters-----------
  155. % K = 0. 000014;
  156. K = 0. 02;
  157. %H_Wiener = (( abs(H_1).^ 2)./(( abs(H_1).^ 2)+K)).*( 1./H_1);
  158. H_Wiener = (( abs(H).^ 2)./(( abs(H).^ 2)+K)).*( 1./H);
  159. F_Wiener = H_Wiener .* G;
  160. f_Wiener = real(ifft2(F_Wiener));
  161. f_Wiener = f_Wiener( 1: 1:M, 1: 1:N);
  162. for x = 1: 1:(M)
  163. for y = 1: 1:(N)
  164. f_Wiener( x, y) = f_Wiener( x, y) * (- 1)^( x+ y);
  165. end
  166. end
  167. [SSIM_Wiener mssim] = ssim_index(f_Wiener,f_original,[ 0. 01 0. 03],ones( 8), 1);
  168. SSIM_Wiener
  169. %% ------show Result------------------
  170. figure();
  171. subplot( 1, 2, 1);
  172. %imshow(f_Wiener( 1: 128, 1: 128),[ 0 1]);
  173. imshow(f_Wiener,[ 0 1]);
  174. xlabel( 'd).Result image by Wiener filter');
  175. subplot( 1, 2, 2);
  176. imshow( log( 1+ abs(F_Wiener)),[ ]);
  177. xlabel( 'c).Fourier spectrum of c).');
  178. % subplot( 1, 2, 2);
  179. % %imshow(f( 1: 128, 1: 128),[ 0 1]);
  180. % imshow(f,[ 0 1]);
  181. % xlabel( 'e).Result image by inverse filter');
  182. figure();
  183. n = 1: 1:P;
  184. plot(n, abs(F( 400,:)), 'r-',n, abs(F_Wiener( 400,:)), 'b-');
  185. axis([ 0 P 0 500]);grid;
  186. xlabel( 'Number of rows(400th column)');
  187. ylabel( 'Fourier amplitude spectrum');
  188. legend( 'F(u,v)', 'F_{Wiener}(u,v)');
  189. figure();
  190. subplot( 1, 2, 1);
  191. imshow( log( 1 + abs(H_Wiener)),[ ]);
  192. xlabel( 'a).F_{Wiener}(u,v).');
  193. subplot( 1, 2, 2);
  194. n = 1: 1:P;
  195. plot(n, abs(H_Wiener( 400,:)));
  196. axis([ 0 P 0 80]);grid;
  197. xlabel( 'Number of rows(400th column)');
  198. ylabel( 'Amplitude spectrum');
  199. %% ------------Constrained_least_squares_filtering---------
  200. p_laplacian = zeros(M,N);
  201. Laplacian = [ 0 - 1 0;
  202. - 1 4 - 1;
  203. 0 - 1 0];
  204. p_laplacian( 1: 3, 1: 3) = Laplacian;
  205. P = 2*M;
  206. Q = 2*N;
  207. for x = 1: 1:M
  208. for y = 1: 1:N
  209. p_laplacian( x, y) = p_laplacian( x, y) * (- 1)^( x+ y);
  210. end
  211. end
  212. P_laplacian = fft2(p_laplacian,P,Q);
  213. F_C = zeros(P,Q);
  214. r = 0. 2;
  215. H_clsf = ((H ')./((abs(H).^2)+r.*P_laplacian));
  216. F_C = H_clsf .* G;
  217. f_c = real(ifft2(F_C));
  218. f_c = f_c(1:1:M,1:1:N);
  219. for x = 1:1:(M)
  220. for y = 1:1:(N)
  221. f_c(x,y) = f_c(x,y) * (-1)^(x+y);
  222. end
  223. end
  224. %%
  225. figure();
  226. subplot(1,2,1);
  227. imshow(f_c,[0 1]);
  228. xlabel('e).Result image by constrained least squares filter (r = 0. 2) ');
  229. subplot(1,2,2);
  230. imshow(log(1 + abs(F_C)),[ ]);
  231. xlabel('f).Fourier spectrum of c). ');
  232. [SSIM_CLSF mssim] = ssim_index(f_c,f_original,[0.01 0.03],ones(8),1);
  233. figure();
  234. subplot(1,2,1);
  235. imshow(log(1 + abs(H_clsf)),[ ]);
  236. xlabel('a).F _ {clsf}(u,v). ');
  237. subplot(1,2,2);
  238. n = 1:1:P;
  239. plot(n,abs(H_clsf(400,:)));
  240. axis([0 P 0 80]);grid;
  241. xlabel('Number of rows( 400th column) ');
  242. ylabel('Amplitude spectrum ');



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

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

NULL


  • 7
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值