Hello Mat

 找回密码
 立即注册
查看: 6524|回复: 0

Lee滤波器

[复制链接]

1294

主题

1520

帖子

110

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22633
发表于 2017-9-21 22:01:14 | 显示全部楼层 |阅读模式
Lee滤波器:
im_ret = Lee( im, 9, 'same', 10, 'symmetric', 1);
  1. function im_ret = Lee( im, w_size, out_size, NL, bound, flag )
  2. %   im:SAR影像
  3. %   w_size:窗口大小,奇数 3 5 7 9等
  4. %   out_size:输出图像的大小,可以是'same'或者'full'
  5. %   NL:number of Looks,等效视数
  6. %   bound:边缘扩展模式,分为'symmetric','replicate','circular'。
  7. %   flag:计算时是否包含中心像素,0为不包含,1为包含。
  8. %
  9. %   bound和flag主要是给im_mean_var用的 :)
  10. % 函数输出:
  11. %   im_ret:滤波结果

  12. if ~isa(im,'double')
  13.     im = double(im)/255;
  14. end
  15. [im_Mean, im_Var] = im_mean_var(im, w_size, out_size, bound, flag); % 求均值和方差
  16. im_Std = sqrt(im_Var);  % 开方
  17. Ci = im_Std ./ im_Mean; % 变差系数
  18. Cu = sqrt(1/NL);        % 噪声变差系数
  19. tmp = 2*log(Cu) - 2.*log(Ci+0.1);
  20. tmp = exp(tmp);
  21. W = 1 - tmp;
  22. im_ret = im .* W + im_Mean .* (1 - W);  % 滤波结果
复制代码
  1. function [im_Mean, im_Var] = im_mean_var(im, w_size, out_size, bound, flag)
  2. % 函数输入:
  3.     % im: 待求的影像,或者矩阵
  4.     % w_size: 窗口的大小,如5代表5*5的窗口
  5.     % out_size:输出图像的大小,可以是'same'或者'full'
  6.     % bound: 边缘的扩展模式,分为'symmetric','replicate','circular'。
  7.     % flag:计算时是否包含中心像素,0为不包含,1为包含。
  8. % 函数输出:
  9.     % im_Mean:均值影像/矩阵
  10.     % im_Var:方差影像/矩阵

  11. % 均值滤波器
  12. h = ones(w_size);
  13. h_size=w_size^2;
  14. if flag == 0
  15.     h((w_size+1)/2,(w_size+1)/2) = 0;
  16.     h_size = h_size - 1;
  17. end
  18. h = h ./ h_size;
  19. im_Mean = imfilter(im, h, bound, out_size);
  20. % 方差
  21. im_Var = zeros(size(im));
  22. % 将原始矩阵按照bound的模式进行边缘扩展
  23. im_pad = padarray(im, [(w_size-1)/2 (w_size-1)/2], bound);
  24. % A = [1 2; 3 4];
  25. % B = padarray(A,[3 2],'replicate','post')
  26. % B =
  27. %      1     2     2     2
  28. %      3     4     4     4
  29. %      3     4     4     4
  30. %      3     4     4     4
  31. %      3     4     4     4
  32.      
  33. imsize = size(im_pad);
  34. row=imsize(1);  % 行
  35. col=imsize(2);  % 列
  36. tmp = (w_size-1)/2;
  37. for i=1:1:row-tmp*2
  38.     for j=1:1:col-tmp*2
  39.         im_sub = imcrop(im_pad, [i, j, w_size-1, w_size-1]); % 取小窗口
  40.         m2v=im_sub(:);
  41.         if(flag == 1)  % 如果包含中间点
  42.             im_Var(j,i) = var(m2v,1);    % 不是无偏估计(N-1),而是用N
  43.         else           % 如果不包含中间点
  44.             tt = zeros(w_size^2-1 , 1);
  45.             tt(1:(w_size^2-1)/2) = m2v(1:(w_size^2-1)/2);
  46.             tt((w_size^2-1)/2+1:end) = m2v((w_size^2-1)/2+2:end);
  47.             im_Var(j,i) = var(tt,1);
  48.         end   
  49.     end
  50. end
复制代码




算法QQ  3283892722
群智能算法链接http://halcom.cn/forum.php?mod=forumdisplay&fid=73
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Python|Opencv|MATLAB|Halcom.cn ( 蜀ICP备16027072号 )

GMT+8, 2024-4-19 20:16 , Processed in 0.232920 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表