常见噪声的分类与Matlab实现

                          
               

1.研究噪声特性的必要性

        本文的内容主要介绍了常见噪声的分类与其特性。将噪声建模,然后用模型去实现各式各样的噪声。

        实际生活中的各种照片的老化,都可以归结为以下老化模型。


     这个模型很简单,也可以直接用以下公式来表达。


在频域内,用以下公式区表示。


     根据以上式子,可以看出,老旧照片的复原,主要分为两个任务,一个是去噪;另一个是去卷积,或者称为逆滤波,也就是将老化滤波器做反处理。

     本文首先由噪声类型与其建模。随后的博文,会介绍几种基础的去噪方法和基础的逆滤波方法。

    

2.噪声的实现

      2.1    评价用图像与其直方图

        

      2.2  高斯噪声

        高斯噪声,也称为正态噪声,其统计特性服从正态分布。一种较为泛用的噪声模型。 
        Matlab的实现较为简单,Matlab已经有一个randn(M,N)的函数,用其可以产生出均值为0、方差为1、尺寸为M X N像素的高斯噪声图像。
        用以下程序就可以产生任意均值和方差的高斯噪声。

a = 0;
b = 0.08;
n_gaussian = a + b .* randn(M,N);

         

        2.3 瑞利噪声

        瑞利噪声相比高斯噪声而言,其形状向右歪斜,这对于拟合某些歪斜直方图噪声很有用。

        瑞利噪声的实现可以借由平均噪声来实现。如下所示。


这里的表示均值为0,方差为1的均匀分布的噪声。Matlab里,使用函数rand(M,N)就可以产生一个均值为0,方差为1的均匀噪声。


   
   
  1. a = - 0. 2;
  2. b = 0. 03;
  3. n_rayleigh = a + (-b .* log( 1 - rand(M,N))).^ 0. 5;

        

       2.4 伽马噪声

         伽马噪声的分布,服从了伽马曲线的分布。伽马噪声的实现,需要使用b个服从指数分布的噪声叠加而来。指数分布的噪声,可以使用均匀分布来实现。


使用若干个(这里用b表示)均匀分布叠加,就可以得到伽马噪声。


当然,当b=1的时候,就可以得到指数噪声了。


   
   
  1. a = 25;
  2. b = 3;
  3. n_Erlang = zeros(M,N);
  4. for j= 1:b
  5.     n_Erlang = n_Erlang + ( -1/a)* log( 1 - rand(M,N));
  6. end



         2.5 均匀噪声

             如同前面所示,均匀噪声可以由函数rand(M,N)直接产生。



   
   
  1. a = 0;
  2. b = 0. 3;
  3. n_Uniform = a + (b-a)* rand(M,N);

         2.6 椒盐噪声

         椒盐噪声也成为双脉冲噪声。在早期的印刷电影胶片上,由于胶片化学性质的不稳定和播放时候的损伤,会使得胶片表面的感光材料和胶片的基底欠落,在播放时候,产生一些或白或黑的损伤。事实上,这也可以归结为特殊的椒盐噪声。

        椒盐噪声的实现,需要一些逻辑判断。这里我们的思路是,产生均匀噪声,然后将超过阈值的点设置为黑点,或白点。当然,如果需要拟合电影胶片的损伤的话,可以选用别的类型噪声去拟合。

       


   
   
  1. a = 0.05;
  2. b = 0.05;
  3. x = rand(M,N);
  4. g_sp = zeros(M,N);
  5. g_sp = f;
  6. g_sp(find(x <=a)) = 0;
  7. g_sp ( find ( x > a & x <(a+b))) = 1;



3.总结

     本文,实现的几类较为基本的噪声。并给出了其实现的方法,代码在下面。下一篇博文,会进行几个常用去噪滤波器的比较。


    
    
  1. close all;
  2. clear all;
  3. clc;
  4. f = imread( './original_pattern.tif');
  5. f = mat2gray(f,[ 0 255]);
  6. [M,N] = size(f);
  7. figure();
  8. subplot( 1, 2, 1);
  9. imshow(f,[ 0 1]);
  10. xlabel( 'a).Original image');
  11. subplot( 1, 2, 2);
  12. x = linspace( -0.2, 1.2, 358);
  13. h = hist(f,x)/(M*N);
  14. Histogram = zeros( 358, 1);
  15. for y = 1: 256
  16.     Histogram = Histogram + h(:,y);
  17. end
  18. bar( -0.2: 1/ 255: 1.2,Histogram);
  19. axis([ -0.2 1.2 0 0.014]),grid;
  20. xlabel( 'b).The Histogram of a');
  21. ylabel( 'Number of pixels');
  22. %% ---------------gaussian-------------------
  23. a = 0;
  24. b = 0.08;
  25. n_gaussian = a + b .* randn(M,N);
  26. g_gaussian = f + n_gaussian;
  27. figure();
  28. subplot( 1, 2, 1);
  29. imshow(g_gaussian,[ 0 1]);
  30. xlabel( 'a).Ruselt of Gaussian noise');
  31. subplot( 1, 2, 2);
  32. x = linspace( -0.2, 1.2, 358);
  33. h = hist(g_gaussian,x)/(M*N);
  34. Histogram = zeros( 358, 1);
  35. for y = 1: 256
  36.     Histogram = Histogram + h(:,y);
  37. end
  38. bar( -0.2: 1/ 255: 1.2,Histogram);
  39. axis([ -0.2 1.2 0 0.014]),grid;
  40. xlabel( 'b).The Histogram of a');
  41. ylabel( 'Number of pixels');
  42. %% ---------------rayleigh-------------------
  43. a = -0.2;
  44. b = 0.03;
  45. n_rayleigh = a + (-b .* log( 1 - rand(M,N))).^ 0.5;
  46. g_rayleigh = f + n_rayleigh;
  47. figure();
  48. subplot( 1, 2, 1);
  49. imshow(g_rayleigh,[ 0 1]);
  50. xlabel( 'a).Ruselt of Rayleigh noise');
  51. subplot( 1, 2, 2);
  52. x = linspace( -0.2, 1.2, 358);
  53. h = hist(g_rayleigh,x)/(M*N);
  54. Histogram = zeros( 358, 1);
  55. for y = 1: 256
  56.     Histogram = Histogram + h(:,y);
  57. end
  58. bar( -0.2: 1/ 255: 1.2,Histogram);
  59. axis([ -0.2 1.2 0 0.014]),grid;
  60. xlabel( 'b).The Histogram of a');
  61. ylabel( 'Number of pixels');
  62. %% ---------------Erlang-------------------
  63. a = 25;
  64. b = 3;
  65. n_Erlang = zeros(M,N);
  66. for j= 1:b
  67.     n_Erlang = n_Erlang + ( -1/a)*log( 1 - rand(M,N));
  68. end
  69. g_Erlang = f + n_Erlang;
  70. figure();
  71. subplot( 1, 2, 1);
  72. imshow(g_Erlang,[ 0 1]);
  73. xlabel( 'a).Ruselt of Erlang noise');
  74. subplot( 1, 2, 2);
  75. x = linspace( -0.2, 1.2, 358);
  76. h = hist(g_Erlang,x)/(M*N);
  77. Histogram = zeros( 358, 1);
  78. for y = 1: 256
  79.     Histogram = Histogram + h(:,y);
  80. end
  81. bar( -0.2: 1/ 255: 1.2,Histogram);
  82. axis([ -0.2 1.2 0 0.014]),grid;
  83. xlabel( 'b).The Histogram of a');
  84. ylabel( 'Number of pixels');
  85. %% ---------------Exponential-------------------
  86. a = 9;
  87. n_Ex = ( -1/a)*log( 1 - rand(M,N));
  88. g_Ex = f + n_Ex;
  89. figure();
  90. subplot( 1, 2, 1);
  91. imshow(g_Ex,[ 0 1]);
  92. xlabel( 'a).Ruselt of Exponential noise');
  93. subplot( 1, 2, 2);
  94. x = linspace( -0.2, 1.2, 358);
  95. h = hist(g_Ex,x)/(M*N);
  96. Histogram = zeros( 358, 1);
  97. for y = 1: 256
  98.     Histogram = Histogram + h(:,y);
  99. end
  100. bar( -0.2: 1/ 255: 1.2,Histogram);
  101. axis([ -0.2 1.2 0 0.014]),grid;
  102. xlabel( 'b).The Histogram of a');
  103. ylabel( 'Number of pixels');
  104. %% ---------------Uniform-------------------
  105. a = 0;
  106. b = 0.3;
  107. n_Uniform = a + (b-a)*rand(M,N);
  108. g_Uniform = f + n_Uniform;
  109. figure();
  110. subplot( 1, 2, 1);
  111. imshow(g_Uniform,[ 0 1]);
  112. xlabel( 'a).Ruselt of Uniform noise');
  113. subplot( 1, 2, 2);
  114. x = linspace( -0.2, 1.2, 358);
  115. h = hist(g_Uniform,x)/(M*N);
  116. Histogram = zeros( 358, 1);
  117. for y = 1: 256
  118.     Histogram = Histogram + h(:,y);
  119. end
  120. bar( -0.2: 1/ 255: 1.2,Histogram);
  121. axis([ -0.2 1.2 0 0.014]),grid;
  122. xlabel( 'b).The Histogram of a');
  123. ylabel( 'Number of pixels');
  124. %% ---------------Salt & pepper-------------------
  125. a = 0.05;
  126. b = 0.05;
  127. x = rand(M,N);
  128. g_sp = zeros(M,N);
  129. g_sp = f;
  130. g_sp(find(x<=a)) = 0;
  131. g_sp(find(x > a & x<(a+b))) = 1;
  132. figure();
  133. subplot( 1, 2, 1);
  134. imshow(g_sp,[ 0 1]);
  135. xlabel( 'a).Ruselt of Salt & pepper noise');
  136. subplot( 1, 2, 2);
  137. x = linspace( -0.2, 1.2, 358);
  138. h = hist(g_sp,x)/(M*N);
  139. Histogram = zeros( 358, 1);
  140. for y = 1: 256
  141.     Histogram = Histogram + h(:,y);
  142. end
  143. bar( -0.2: 1/ 255: 1.2,Histogram);
  144. axis([ -0.2 1.2 0 0.3]),grid;
  145. xlabel( 'b).The Histogram of a');
  146. ylabel( 'Number of pixels');

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



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

2016 - 5 - 21 修正英文单词的拼写错误。


           
               
  • 6
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值