双边滤波器的原理及实现

图像算法--基于fpga的双边滤波算法 双边滤波器是用于图像的非线性、边缘保持和降噪平滑滤波器。它将每个像素的强度替换为附近像素的强度值的加权平均值。该权重不仅取决于像素的欧几里德距离,还取决于辐射差异(例如颜色强度、深度距离等)。这样可以保留锐利的边缘。 阅读详情

转载:http://blog.youkuaiyun.com/abcjennifer/article/details/7616663

双边滤波器是什么?

双边滤波(Bilateral filter)是一种可以保边去噪的滤波器。之所以可以达到此去噪效果,是因为滤波器是由两个函数构成。一个函数是由几何空间距离决定滤波器系数。另一个由像素差值决定滤波器系数。可以与其相比较的两个filter:高斯低通滤波器(http://en.wikipedia.org/wiki/Gaussian_filter)和α-截尾均值滤波器(去掉百分率为α的最小值和最大之后剩下像素的均值作为滤波器),后文中将结合公式做详细介绍。


双边滤波器中,输出像素的值依赖于邻域像素的值的加权组合,


权重系数w(i,j,k,l)取决于定义域核


和值域核

的乘积


同时考虑了空间域与值域的差别,而Gaussian Filter和α均值滤波分别只考虑了空间域和值域差别。


=======================================================================

双边滤波器的实现(MATLAB):function B = bfilter2(A,w,sigma)

CopyRight:

% Douglas R. Lanman, Brown University, September 2006.
% dlanman@brown.edu, http://mesh.brown.edu/dlanman


具体请见function B = bfltGray(A,w,sigma_d,sigma_r)函数说明。


[cpp]  view plain copy
  1. %简单地说:  
  2. %A为给定图像,归一化到[0,1]的矩阵  
  3. %W为双边滤波器(核)的边长/2  
  4. %定义域方差σd记为SIGMA(1),值域方差σr记为SIGMA(2)  
  5.   
  6. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
  7. % Pre-process input and select appropriate filter.  
  8. function B = bfilter2(A,w,sigma)  
  9.   
  10. % Verify that the input image exists and is valid.  
  11. if ~exist('A','var') || isempty(A)  
  12.    error('Input image A is undefined or invalid.');  
  13. end  
  14. if ~isfloat(A) || ~sum([1,3] == size(A,3)) || ...  
  15.       min(A(:)) < 0 || max(A(:)) > 1  
  16.    error(['Input image A must be a double precision ',...  
  17.           'matrix of size NxMx1 or NxMx3 on the closed ',...  
  18.           'interval [0,1].']);        
  19. end  
  20.   
  21. % Verify bilateral filter window size.  
  22. if ~exist('w','var') || isempty(w) || ...  
  23.       numel(w) ~= 1 || w < 1  
  24.    w = 5;  
  25. end  
  26. w = ceil(w);  
  27.   
  28. % Verify bilateral filter standard deviations.  
  29. if ~exist('sigma','var') || isempty(sigma) || ...  
  30.       numel(sigma) ~= 2 || sigma(1) <= 0 || sigma(2) <= 0  
  31.    sigma = [3 0.1];  
  32. end  
  33.   
  34. % Apply either grayscale or color bilateral filtering.  
  35. if size(A,3) == 1  
  36.    B = bfltGray(A,w,sigma(1),sigma(2));  
  37. else  
  38.    B = bfltColor(A,w,sigma(1),sigma(2));  
  39. end  
  40.   
  41.   
  42. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
  43. % Implements bilateral filtering for grayscale images.  
  44. function B = bfltGray(A,w,sigma_d,sigma_r)  
  45.   
  46. % Pre-compute Gaussian distance weights.  
  47. [X,Y] = meshgrid(-w:w,-w:w);  
  48. %创建核距离矩阵,e.g.  
  49. %  [x,y]=meshgrid(-1:1,-1:1)  
  50. %   
  51. % x =  
  52. %   
  53. %     -1     0     1  
  54. %     -1     0     1  
  55. %     -1     0     1  
  56. %   
  57. %   
  58. % y =  
  59. %   
  60. %     -1    -1    -1  
  61. %      0     0     0  
  62. %      1     1     1  
  63. %计算定义域核  
  64. G = exp(-(X.^2+Y.^2)/(2*sigma_d^2));  
  65.   
  66. % Create waitbar.  
  67. h = waitbar(0,'Applying bilateral filter...');  
  68. set(h,'Name','Bilateral Filter Progress');  
  69.   
  70. % Apply bilateral filter.  
  71. %计算值域核H 并与定义域核G 乘积得到双边权重函数F  
  72. dim = size(A);  
  73. B = zeros(dim);  
  74. for i = 1:dim(1)  
  75.    for j = 1:dim(2)  
  76.         
  77.          % Extract local region.  
  78.          iMin = max(i-w,1);  
  79.          iMax = min(i+w,dim(1));  
  80.          jMin = max(j-w,1);  
  81.          jMax = min(j+w,dim(2));  
  82.          %定义当前核所作用的区域为(iMin:iMax,jMin:jMax)  
  83.          I = A(iMin:iMax,jMin:jMax);%提取该区域的源图像值赋给I  
  84.         
  85.          % Compute Gaussian intensity weights.  
  86.          H = exp(-(I-A(i,j)).^2/(2*sigma_r^2));  
  87.         
  88.          % Calculate bilateral filter response.  
  89.          F = H.*G((iMin:iMax)-i+w+1,(jMin:jMax)-j+w+1);  
  90.          B(i,j) = sum(F(:).*I(:))/sum(F(:));  
  91.                  
  92.    end  
  93.    waitbar(i/dim(1));  
  94. end  
  95.   
  96. % Close waitbar.  
  97. close(h);  
  98.   
  99.   
  100. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
  101. % Implements bilateral filter for color images.  
  102. function B = bfltColor(A,w,sigma_d,sigma_r)  
  103.   
  104. % Convert input sRGB image to CIELab color space.  
  105. if exist('applycform','file')  
  106.    A = applycform(A,makecform('srgb2lab'));  
  107. else  
  108.    A = colorspace('Lab<-RGB',A);  
  109. end  
  110.   
  111. % Pre-compute Gaussian domain weights.  
  112. [X,Y] = meshgrid(-w:w,-w:w);  
  113. G = exp(-(X.^2+Y.^2)/(2*sigma_d^2));  
  114.   
  115. % Rescale range variance (using maximum luminance).  
  116. sigma_r = 100*sigma_r;  
  117.   
  118. % Create waitbar.  
  119. h = waitbar(0,'Applying bilateral filter...');  
  120. set(h,'Name','Bilateral Filter Progress');  
  121.   
  122. % Apply bilateral filter.  
  123. dim = size(A);  
  124. B = zeros(dim);  
  125. for i = 1:dim(1)  
  126.    for j = 1:dim(2)  
  127.         
  128.          % Extract local region.  
  129.          iMin = max(i-w,1);  
  130.          iMax = min(i+w,dim(1));  
  131.          jMin = max(j-w,1);  
  132.          jMax = min(j+w,dim(2));  
  133.          I = A(iMin:iMax,jMin:jMax,:);  
  134.         
  135.          % Compute Gaussian range weights.  
  136.          dL = I(:,:,1)-A(i,j,1);  
  137.          da = I(:,:,2)-A(i,j,2);  
  138.          db = I(:,:,3)-A(i,j,3);  
  139.          H = exp(-(dL.^2+da.^2+db.^2)/(2*sigma_r^2));  
  140.         
  141.          % Calculate bilateral filter response.  
  142.          F = H.*G((iMin:iMax)-i+w+1,(jMin:jMax)-j+w+1);  
  143.          norm_F = sum(F(:));  
  144.          B(i,j,1) = sum(sum(F.*I(:,:,1)))/norm_F;  
  145.          B(i,j,2) = sum(sum(F.*I(:,:,2)))/norm_F;  
  146.          B(i,j,3) = sum(sum(F.*I(:,:,3)))/norm_F;  
  147.                   
  148.    end  
  149.    waitbar(i/dim(1));  
  150. end  
  151.   
  152. % Convert filtered image back to sRGB color space.  
  153. if exist('applycform','file')  
  154.    B = applycform(B,makecform('lab2srgb'));  
  155. else    
  156.    B = colorspace('RGB<-Lab',B);  
  157. end  
  158.   
  159. % Close waitbar.  
  160. close(h);  


调用方法:

[cpp]  view plain copy
  1. I=imread('einstein.jpg');  
  2. I=double(I)/255;  
  3.   
  4. w     = 5;       % bilateral filter half-width  
  5. sigma = [3 0.1]; % bilateral filter standard deviations  
  6.   
  7. I1=bfilter2(I,w,sigma);  
  8.   
  9. subplot(1,2,1);  
  10. imshow(I);  
  11. subplot(1,2,2);  
  12. imshow(I1)  

实验结果:

双边滤波(Bilateral filter)原理介绍及matlab程序实现 双边滤波(Bilateral filter)原理介绍及matlab程序实现、空间域、值域 阅读详情

相关推荐

双边滤波器原理简述及C++实现

本文主要简述双边滤波器原理,尽可能通俗易懂,最后用C++实现双边滤波器,加深对原理及公式的理解。

puqian13的博客 553

双边滤波原理和实现

双边滤波,c语言实现,与opencv对比

qq_53349978的博客 6454

深度排查:网讯网卡WX1860AL4千兆网口降速百兆的硬件陷阱

本文详细剖析了网讯网卡WX1860AL4千兆网口降速至百兆的硬件故障排查过程。通过分析千兆以太网硬件原理,提供从网线、供电到PCB走线、焊接残留的标准化检修流程,并分享两种典型硬件陷阱(线序错误与焊锡短路)的实战修复案例,为硬件工程师解决类似传输速率问题提供系统性的诊断思路与方法。

a3b4c5的博客 1111

双边滤波

双边滤波是一种非线性滤波器,它可以达到保持边缘、降噪平滑的效果。和其他滤波原理一样,双边滤波也是采用加权平均的方法,用周边像素亮度值的加权平均代表某个像素的强度,所用的加权平均基于高斯分布[1]。最重要的是,双边滤波的权重不仅考虑了像素的欧氏距离(如普通的高斯低通滤波,只考虑了位置对中心像素的影响),还考虑了像素范围域中的辐射差异(例如卷积核中像素与中心像素之间相似程度、颜色强度,深度距离等),在...

weixin_41484240的博客 2196

VFIO框架源码分析(二十二)- IOMMUFD 的脏页跟踪与 Dirty Bits 读取

在虚拟化热迁移(Live Migration)的场景中,脏页追踪(Dirty Page Tracking)是最具挑战性的环节之一。它的核心任务是实时捕获设备(DMA)对内存的写操作,以便 VMM(如 QEMU)知道哪些内存页需要被重新传输到目标主机。在强耦合与粗粒度:脏页追踪是绑定在 Container 上的。这意味着,如果一个 Container 内有多个设备,哪怕只有一个设备在写内存,脏页追踪也会影响 Container 内的所有设备。软件模拟开销大。

qq_36071928的博客 1042

告别眼疲劳!保姆级教程:给你的SecureCRT v8.7.2换上护眼高亮配色(附透明背景设置)

本文提供了一份详细的SecureCRT v8.7.2护眼高亮配色方案教程,帮助程序员缓解眼疲劳问题。通过科学调整配色方案、动态环境自适应设置以及字体渲染优化,显著提升终端使用的舒适度和工作效率。特别推荐Solarized Dark和One Dark Pro医学适配版配色方案,适合长时间编码工作。

weixin_42549496的博客 354

双边滤波方法原理与代码实践(附完整代码)

本文首发于公众微信号-AI研究订阅号。 双边滤波原理   双边滤波(Bilateral filter)是一种非线性的滤波方法,本质是基于高斯滤波,目的是解决高斯滤波造成的边缘模糊。结合图像的空间邻近度和像素值相似度的一种折处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。具有简单、非迭代、局部的特点。   双边滤波器的好处是可以做边缘保存(edge preserving),一般用高斯滤波...

小小何先生的学习之旅 4224

AntV G6边动画实战:手把手教你实现数据流向箭头与虚线流动效果

本文详细解析了如何使用AntV G6实现数据流向箭头与虚线流动效果,通过自定义边动画提升数据可视化的动态表现力。从基础环境搭建到核心概念讲解,再到虚线流动动画和箭头路径动画的具体实现与参数调控,帮助开发者掌握G6边动画的高级技巧,适用于网络流量监控、数据传递等场景。

weixin_28487433的博客 265

双边滤波器原理及Matlab实现

双边滤波器是什么? 双边滤波(Bilateral filter)是一种可以保边去噪的滤波器。之所以可以达到此去噪效果,是因为滤波器是由两个函数构成。一个函数是由几何空间距离决定滤波器系数。另一个由像素差值决定滤波器系数。可以与其相比较的两个filter:高斯低通滤波器(http://en.wikipedia.org/wiki/Gaussian_filter)和α-截尾均值滤波器(去掉百分率为α的最小

蘇丶的博客 1万+

COMSOL金属氢化物-放氢过程

"层流"的出口设置压降函数,解决“找不到一致的初始值”问题,主要是一开始设置出口为1atm的话,压力场过渡太剧烈,不好找到初始解,要么就先算个稳态流场,这种也能求解。注:P0是根据实测PCT的插值曲线(函数名称为:p_iso)得到的,根据初始质量储氢量wtw0,和初始温度条件T0,然后根据函数p_iso(wtw0)*exp(-deltHd/R_const*(1/T0-1/303.15[K]))求解获得。若"初始步长"选择框不勾上,前面0~5s内的求解容易发散,然后求解失败。2、设置"达西定律"的。

qq_24800941的博客 1929

5分钟搞定!用Cursor和.NET 9.0快速搭建串口通讯上位机(附VS Code插件配置)

本文分享了如何利用Cursor AI编程助手与.NET 9.0,在5分钟内快速构建一个功能完整的串口通讯上位机程序。通过自然语言描述需求,AI自动生成WinForms界面和核心代码,极大提升了硬件调试工具的定制开发效率。文章详细介绍了环境配置、AI协作编码、功能实现与调试的全过程。

weixin_28366353的博客 274

双边滤波器原理及实现

双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。具有简单、非迭代、局部的特点。双边滤波器的好处是可以做边缘保存(edge preserving),一般过去用的维纳滤波或者高斯滤波去降噪,都会较明显地模糊边缘,对于高频细节的保护效果并不明显

图像研究猿的专栏 1万+

番外篇 | 复现HIC-YOLOv5,助力小目标物体的检测

在本文中提出了一种改进的YOLOv5算法:HIC-YOLOv5,用于小目标检测,具有更好的性能和较低的计算成本。🌈

小哥谈 1129

双边滤波原理和matlab,双边滤波器的原理及实现

优快云如何转载别人文章啊?!!!悲剧只能复制黏贴了双边滤波器是什么?双边滤波(Bilateral filter)是一种可以保边去噪的滤波器。之所以可以达到此去噪效果,是因为滤波器是由两个函数构成。一个函数是由几何空间距离决定滤波器系数。另一个由像素差值决定滤波器系数。可以与其相比较的两个filter:高斯低通滤波器(http://en.wikipedia.org/wiki/Gaussian_fi...

weixin_30260621的博客 606

SAP MD81创建客户独立需求简介

正常我们用的最多的计划独立需求都是使用的是MD61 ,今天我们说下SAP的另外的一个标准功能客户独立需求MD81。虽然SAP给这个TCODE的描述是客户独立需求,但是实际是没有地方去关联对应的客户信息的。可以看到根据客户需求产生了对应的计划订单,我们创建的时候选择的KSV是按库存生产的,所以转换的时候生产订单也按单生产的。上面填写的这些字段的信息是不是和我们销售订单里面的字段的信息很相似。1)填写交货日期,可以选择按月 ,按日,按周等类型选择对应的日期。保存后会显示对应的客户独立需求的号码,如下图。

我小时候很黑的博客 2901

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

能使曲线变平滑的一维滤波器_双边滤波器的原理及实现

双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。双边滤波器之所以能够做到在平滑去噪的同时还能够很好的保存边缘(Edge Preserve),是由于其滤波器的核由两个函数生成:一个函数由像素欧式距离决定滤波器模板的系数另一个函数由像素的灰度差值决定滤波器的系数其综合了高...

weixin_35043331的博客 933

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

上一篇: 从K近邻算法、距离度量谈到KD树、SIFT+BBF算法
下一篇: SIFT算法详解
Savitch
博客等级 码龄16年 84粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值