1. 程式人生 > >常見噪聲的分類與Matlab實現

常見噪聲的分類與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');