Hello Mat

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

Non-Local Means滤波器

[复制链接]

1298

主题

1524

帖子

114

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22653
发表于 2017-9-21 22:03:46 | 显示全部楼层 |阅读模式
Non-Local Means滤波器
D = Non_Local_Means(im,3,3,0.15);  % 应用Non-Local Means滤波图像
  1. function DeNimg = Non_Local_Means(Nimg,PSH,WSH,Sigma)
  2. % Non_Local_Means滤波器
  3. %函数输入:
  4. %         Nimg:  输入的图像矩阵 + 带噪声的
  5. %         PSH:  扩展窗尺寸大小
  6. %         WSH: 窗尺寸大小
  7. %         Sigma:方差
  8. %函数输出:
  9. %         DeNimg: 重构滤波图像

  10. if ~isa(Nimg,'double')
  11.     Nimg = double(Nimg)/255;
  12. end

  13. % 图像维数
  14. [Height,Width] = size(Nimg);
  15. u = zeros(Height,Width); % 初始化去噪图像矩阵
  16. M = u; % 初始化权值矩阵
  17. Z = M; % 初始化叠加权值 accumlated weights
  18. % 避免边界效应
  19. PP = padarray(Nimg,[PSH,PSH],'symmetric','both');
  20. PW = padarray(Nimg,[WSH,WSH],'symmetric','both');
  21. % padarray使用
  22. % A =
  23. %      1     3     4
  24. %      2     3     4
  25. %      3     4     5
  26. % B = padarray(A, 2 * [1 1], 0, 'both')
  27. %      0     0     0     0     0     0     0
  28. %      0     0     0     0     0     0     0
  29. %      0     0     1     3     4     0     0
  30. %      0     0     2     3     4     0     0
  31. %      0     0     3     4     5     0     0
  32. %      0     0     0     0     0     0     0
  33. %      0     0     0     0     0     0     0
  34. % 主循环
  35. for dx = -WSH:WSH
  36.     for dy = -WSH:WSH
  37.         if dx ~= 0 || dy ~= 0
  38.             Sd = integral_img(PP,dx,dy);  % 插值图像
  39.             % 获取对应像素点的平方差矩阵
  40.             SDist = Sd(PSH+1:end-PSH,PSH+1:end-PSH)+Sd(1:end-2*PSH,1:end-2*PSH)-Sd(1:end-2*PSH,PSH+1:end-PSH)-Sd(PSH+1:end-PSH,1:end-2*PSH);      
  41.             % 计算每一个像素点的权值
  42.             w = exp(-SDist/(2*Sigma^2));
  43.             % 得到相应的噪声点
  44.             v = PW((WSH+1+dx):(WSH+dx+Height),(WSH+1+dy):(WSH+dy+Width));
  45.             % 更新去噪图像矩阵
  46.             u = u+w.*v;
  47.             % 更新权值去噪图像矩阵
  48.             M = max(M,w);
  49.             % 更新叠加权值 accumlated weights
  50.             Z = Z+w;
  51.         end
  52.     end
  53. end
  54. % 重构图像        
  55. f = 1;
  56. u = u+f*M.*Nimg;
  57. u = u./(Z+f*M);
  58. DeNimg = u; % 重构去噪图像

  59. function Sd = integral_img(v,dx,dy)
  60. % 根据平方差,插值图像
  61. % 变换计算:tx = vx+dx; ty = vy+dy
  62. t = img_Shift(v,dx,dy);
  63. % 平方差图像
  64. diff = (v-t).^2;
  65. % 沿行插值
  66. Sd = cumsum(diff,1);  % 行叠加
  67. % 沿列插值
  68. Sd = cumsum(Sd,2);    % 列叠加

  69. function t = img_Shift(v,dx,dy)
  70. % 在xy坐标系下,进行图像变换操作
  71. t = zeros(size(v));
  72. type = (dx>0)*2+(dy>0);
  73. switch type
  74.     case 0 % dx<0,dy<0: 向右下方移动
  75.         t(-dx+1:end,-dy+1:end) = v(1:end+dx,1:end+dy);
  76.     case 1 % dx<0,dy>0: 向左下方移动
  77.         t(-dx+1:end,1:end-dy) = v(1:end+dx,dy+1:end);
  78.     case 2 % dx>0,dy<0: 向右上方移动
  79.         t(1:end-dx,-dy+1:end) = v(dx+1:end,1:end+dy);
  80.     case 3 % dx>0,dy>0: 向左上方移动
  81.         t(1:end-dx,1:end-dy) = v(dx+1:end,dy+1:end);
  82. end
复制代码






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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 01:06 , Processed in 0.230293 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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