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

波变换

开发平台:

Matlab

  1. function X = wdenoise(x, measure, sorh, thr, wname, n)
  2. % 阈值去噪函数
  3. %   x为带噪声图像 
  4. %   measure表示全局或局部
  5. %   sorh表示软硬阈值方法
  6. %   thr为阈值
  7. %   wname为小波函数名
  8. %   n为分解层次
  9. [C, S] = wavedec2(x, n, wname);                 % 对图像进行小波分解
  10. switch measure
  11.     case 'gbl'                                  % 全局阈值方法
  12.         dcoef = C( prod(S(1, :)) + 1 : end);    %   提取细节部分系数
  13.         switch sorh
  14.             case 'h'                            %   硬阈值
  15.                 dcoef = dcoef .* (abs(dcoef) > thr);
  16.             case 's'                            %   软阈值
  17.                 temp = abs(dcoef) - thr;
  18.                 temp = (temp + abs(temp)) / 2;
  19.                 dcoef = sign(dcoef) .* temp;
  20.         end
  21.         C( prod(S(1, :)) + 1 : end) = dcoef;
  22.         
  23.     case 'lvd'                                  % 局部阈值方法
  24.         for i = n:-1:1                          %   每层单独处理
  25.             k = size(S,1) - i;
  26.             first = prod(S(1, :)) + ...
  27.                 3 * sum(S(2:k-1, 1) .* S(2:k-1, 2)) + 1;    
  28.                                                 %   第i层细节系数的起始位置
  29.             last = first + 3*prod(S(k,:)) - 1;  %   终止位置
  30.             dcoef = C(first : last);            %   细节系数
  31.         switch sorh
  32.             case 'h'                            %   硬阈值
  33.                 dcoef = dcoef .* (abs(dcoef) > thr(i));
  34.             case 's'                            %   软阈值
  35.                 temp = abs(dcoef) - thr(i);
  36.                 temp = (temp + abs(temp)) / 2;
  37.                 dcoef = sign(dcoef) .* temp;
  38.         end
  39.             C(first:last) = dcoef;
  40.         end
  41. end
  42. X = waverec2(C, S, wname);                      % 重构图像