Hello Mat

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

Bilateral双边滤波器

[复制链接]

1294

主题

1520

帖子

110

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22633
发表于 2017-9-21 21:38:01 | 显示全部楼层 |阅读模式
Bilateral双边滤波器
[im1, PSNR] = bif_filter(im,3,0.2);
  1. function [out, psn]=bif_filter(im,sigd,sigr)
  2. % bilateral filter双边滤波器
  3. % 函数输入:
  4. %           im    输入的图像
  5. %           sigd  空间内核的时域参数
  6. %           sigr  内核参数强度变化范围
  7. % 函数输出:
  8. %          out  滤波图像 = output imagespatial kernel

  9. w=(2*sigd)+1;
  10. % sigr=(n*100)^2/(.003*(sigd^2));  % 自适应R值,n为高斯噪声强度,n=0.001

  11. % 高斯滤波器
  12. gw=zeros(w,w);       % 高斯权值矩阵初始化
  13. c=ceil(w/2);         % 向前取整
  14. c=[c c];             % 中心元素位置

  15. for i=1:w   
  16.     for j=1:w
  17.         q=[i,j]; % 记录相连像素位置标识位
  18.         gw(i,j)=norm(c-q); % 欧氏距离
  19.     end
  20. end

  21. Gwd=(exp(-(gw.^2)/(2*(sigd^2)))); % 高斯函数

  22. % Padding 扩展图像的边界,防止滑动窗口边界值溢出
  23. proci=padarray(im,[sigd sigd],'replicate');
  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. [row clm]=size(proci);    % Size of image
  33. if ~isa(proci,'double')
  34.     proci = double(proci)/255;   % 转换为double类型
  35. end

  36. K=sigd;
  37. L=[-K:K];
  38. c=K+1;   % 中心元素位置
  39. iter=length(L); % 迭代次数
  40. ind=1;

  41. for r=(1+K):(row-K)          % 行   
  42.     for s=(1+K):(clm-K)      % 列     
  43.             for i=1:iter     % 窗口大小 行
  44.                 for j=1:iter % 窗口大小 列                  
  45.                     win(i,j)=proci((r+L(i)),(s+L(j))); % 获取窗口                  
  46.                 end
  47.             end
  48.             I=win; % 灰度矩阵
  49.             win=win(c,c)-win; % 相对中心点处的强度差异,中心点为参考灰度值
  50.             win=sqrt(win.^2); % 保证win中的每一个元素为正
  51.             Gwi=exp(-(win.^2)/(2*(sigr^2))); % 高斯函数      
  52.             weights=(Gwi.*Gwd)/sum(sum(Gwi.*Gwd)); % 高斯权值
  53.             Ii=sum(sum(weights.*I));               % 得到当前双边滤波值  
  54.             proci(r,s)=Ii;                         % 替换当前灰度值
  55.             win=[];
  56.     end
  57. end

  58. % 移除边界扩展值
  59. proci=rpadd(proci,K);  % 移除边界扩展值
  60. out=im2uint8(proci);   % 类型转换

  61. %% 滤波重建后,图像峰值信噪比计算
  62. if ~isa(out,'double')
  63.     dimg = double(out)/255;   % 转换为double类型
  64. end
  65. psn = PSN(im,dimg); % PSNR,峰值信噪比
  66.         
  67. end

  68. function x=rpadd(R,K)
  69. % 移除边界扩展值
  70. % 函数输入:
  71. %         R    输入的图像矩阵
  72. %         K    窗口大小(2*K + 1)
  73. % 函数输出:
  74. %         x    移除边界扩展值后的原图像矩阵
  75. for i=1:K
  76.     R(1,:)=[];
  77.     R(:,1)=[];
  78.     [ro cl]= size(R);
  79.     R(ro,:)=[];
  80.     R(:,cl)=[];;
  81. end
  82. x=R;
  83. end

  84. function [out]=PSN(orgimg,mimg)
  85. % 峰值信噪比计算

  86. orgimg =im2double(orgimg);
  87. mimg   =im2double(mimg);
  88. Mse=sum(sum((orgimg-mimg).^2))/(numel(orgimg)); % Mean square Error均方差
  89. out=10*log10(1/Mse);
  90. end   
复制代码




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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 04:58 , Processed in 0.210679 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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