den4.m
上传用户:lcj80317
上传日期:2007-01-26
资源大小:625k
文件大小:3k
源码类别:

波变换

开发平台:

Matlab

  1. function X = den4(x, wname, n)
  2. % "Feature Adaptive Wavelet Shrinkage for Image Denoising"
  3. % 初始化参数值
  4. R       = 5;                                    % 窗口大小
  5. alpha   = 0.1;                                  % 控制小波系数缩减的程度
  6. beta    = 0.3;
  7. delta   = DELTA(x);                             % 噪方差σ
  8. lambda2 = 4 * delta^2 * log(R);                 % 局部阈值(?) λ^2
  9. [C, S] = wavedec2(x, n, wname);                 % 对图像进行小波分解
  10. % 提取每层系数并进行处理
  11. for i = n : -1 : 1
  12.     cH = detcoef2('h', C, S, i);                % 水平细节系数
  13.     cV = detcoef2('v', C, S, i);                % 垂直细节系数
  14.     cD = detcoef2('d', C, S, i);                % 对角线细节系数
  15.     
  16.     dim = size(cH);
  17.     % 分别处理三个方向的系数
  18.     for j = 1 : dim(1)
  19.         for k = 1 : dim(2)
  20.             S_jk2 = energy(cH, j, k, R);
  21.             cH(j, k) = shrink(cH(j, k), S_jk2, alpha, beta, lambda2);
  22.             
  23.             S_jk2 = energy(cV, j, k, R);
  24.             cV(j, k) = shrink(cV(j, k), S_jk2, alpha, beta, lambda2);
  25.             
  26.             S_jk2 = energy(cD, j, k, R);
  27.             cD(j, k) = shrink(cD(j, k), S_jk2, alpha, beta, lambda2);
  28.         end
  29.     end
  30.     
  31.     % 再把系数放回去……  
  32. k     = size(S,1) - i;
  33. first = S(1,1)*S(1,2) + 3 * sum(S(2:k-1, 1).*S(2:k-1, 2)) + 1;  % 起始位置
  34. add   = S(k,1)*S(k,2);                                          % 系数长度
  35.     
  36.     C(first : first + add - 1) = reshape(cH, 1, add);
  37.     C(first + add : first + 2*add - 1) = reshape(cV, 1, add);
  38.     C(first + 2*add : first + 3*add - 1) = reshape(cD, 1, add);
  39. end
  40. X = waverec2(C, S, wname);                      % 重构图像
  41. % -------------------------------------------------------------------------
  42. %%%
  43. %%% delta
  44. %%% 
  45. function delta = DELTA(x)
  46. %   估计噪声方差σ
  47. %
  48. [C, S] = wavedec2(x, 1, 'db1');                             % 小波分解
  49. d = C( prod( S(1,:) ) + 2 * prod( S(2,:) ) + 1 : end);      % HH子带系数
  50. delta = median( abs(d) ) / 0.6745;                          % 计算delta
  51. %%%
  52. %%% energy
  53. %%%
  54. function S_jk2 = energy(cM, j, k, R)
  55. %   计算小波系数附近的能量
  56. %
  57. dim = size(cM);
  58. % 边界判断
  59. row_min = (j-1 < fix(R/2)) * (1-j) + (j-1 >= fix(R/2)) * fix(-R/2);
  60. row_max = (dim(1)-j < fix(R/2)) * (dim(1)-j) + (dim(1)-j >= fix(R/2)) * fix(R/2);
  61. col_min = (k-1 < fix(R/2)) * (1-k) + (k-1 >= fix(R/2)) * fix(-R/2);
  62. col_max = (dim(2)-k < fix(R/2)) * (dim(2)-k) + (dim(2)-k >= fix(R/2)) * fix(R/2);
  63. s = 0;
  64. for m = row_min : row_max
  65.     for n = col_min : col_max
  66.         s = cM(j + m, k + n)^2 + s;
  67.     end
  68. end
  69. S_jk2 = s / R^2;
  70. %%%
  71. %%% shrink
  72. %%%
  73. function d_jk = shrink(d, S_jk2, alpha, beta, lambda2)
  74. %   处理小波系数
  75. %
  76. if S_jk2 >= beta * lambda2
  77.     d_jk = d * (1 - alpha * lambda2 / S_jk2);
  78. else
  79.     d_jk = 0;
  80. end