赞
踩
双边滤波(Bilateral filter)是一种非线性的滤波方法,本质是基于高斯滤波,目的是解决高斯滤波造成的边缘模糊。结合图像的空间邻近度和像素值相似度的一种折处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。具有简单、非迭代、局部的特点。
双边滤波器的好处是可以做边缘保存(edge preserving),一般用高斯滤波去降噪,会较明显地模糊边缘,对于高频细节的保护效果并不明显。双边滤波器顾名思义比高斯滤波多了一个高斯方差sigma-d,它是基于空间分布的高斯滤波函数,所以在边缘附近,离的较远的像素不会太多影响到边缘上的像素值,这样就保证了边缘附近像素值的保存。但是由于保存了过多的高频信息,对于彩色图像里的高频噪声,双边滤波器不能够干净的滤掉,只能够对于低频信息进行较好的滤波。
双边滤波器的输出像素依赖于当前被卷积像素的邻域。
i
i
i和
j
j
j是当前被卷积像素的坐标点,
k
k
k和
l
l
l是领域像素的坐标点。双边滤波公式如下所示:
g
(
i
,
j
)
=
∑
k
,
l
f
(
k
,
l
)
w
(
i
,
j
,
k
,
l
)
∑
k
,
l
w
(
i
,
j
,
k
.
l
)
g(i,j) = \frac{\sum_{k,l}f(k,l)w(i,j,k,l)}{\sum_{k,l}w(i,j,k.l)}
g(i,j)=∑k,lw(i,j,k.l)∑k,lf(k,l)w(i,j,k,l)
加权系数 w w w由定义域核和值域核决定,是它们的乘积。定义域核是高斯核,如下公式所示:
d ( i , j , k , l ) = e x p ( − ( i − k ) 2 + ( j − l ) 2 2 σ d 2 ) d(i,j,k,l)=exp(-\frac{(i-k)^{2}+(j-l)^{2}}{2\sigma^{2}_{d}}) d(i,j,k,l)=exp(−2σd2(i−k)2+(j−l)2)
而值域核就是用于“推断”是否是边缘点的方法,如下公式所示:
r
(
i
,
j
,
k
,
l
)
=
e
x
p
(
−
∣
∣
f
(
i
,
j
)
−
f
(
k
,
l
)
∣
∣
2
2
σ
r
2
)
r(i,j,k,l)=exp(-\frac{||f(i,j)-f(k,l)||^{2}}{2\sigma^{2}_{r}})
r(i,j,k,l)=exp(−2σr2∣∣f(i,j)−f(k,l)∣∣2)
值域核的大小取决于被卷积像素的灰度值和邻域像素的灰度值的差。边缘有较大灰度变化时,则会生成较小的权值,与被卷积像素的灰度值类似的区域会生成较大的权值。
相乘就得到加权系数 w w w,如下公式所示:
w ( i , j , k , l ) = e x p ( − ( i − k ) 2 + ( j − l ) 2 2 σ d 2 − ∣ ∣ f ( i , j ) − f ( k , l ) ∣ ∣ 2 2 σ r 2 ) w(i,j,k,l)=exp(-\frac{(i-k)^{2}+(j-l)^{2}}{2\sigma^{2}_{d}}-\frac{||f(i,j)-f(k,l)||^{2}}{2\sigma^{2}_{r}}) w(i,j,k,l)=exp(−2σd2(i−k)2+(j−l)2−2σr2∣∣f(i,j)−f(k,l)∣∣2)
双边滤波的原理示意图如下图所示:
clear all;close all;clc; img=imread('boy_noisy.gif'); img=mat2gray(img); [m n]=size(img); r=15; %模板半径 imgn=zeros(m+2*r+1,n+2*r+1); imgn(r+1:m+r,r+1:n+r)=img; imgn(1:r,r+1:n+r)=img(1:r,1:n); %扩展上边界 imgn(1:m+r,n+r+1:n+2*r+1)=imgn(1:m+r,n:n+r); %扩展右边界 imgn(m+r+1:m+2*r+1,r+1:n+2*r+1)=imgn(m:m+r,r+1:n+2*r+1); %扩展下边界 imgn(1:m+2*r+1,1:r)=imgn(1:m+2*r+1,r+1:2*r); %扩展左边界 sigma_d=7; sigma_r=0.2; [x,y] = meshgrid(-r:r,-r:r); w1=exp(-(x.^2+y.^2)/(2*sigma_d^2)); %以距离作为自变量高斯滤波器 for i=r+1:m+r for j=r+1:n+r w2=exp(-(imgn(i-r:i+r,j-r:j+r)-imgn(i,j)).^2/(2*sigma_r^2)); %以周围和当前像素灰度差值作为自变量的高斯滤波器 w=w1.*w2; s=imgn(i-r:i+r,j-r:j+r).*w; imgn(i,j)=sum(sum(s))/sum(sum(w)); end end subplot(1,2,1);imshow(img);title('Origin image'); %显示原始图像 subplot(1,2,2);imshow(mat2gray(imgn(r+1:m+r,r+1:n+r)));title('Bilateral_filter');%显示滤波后的图像
完整实验代码,公众号后台回复:数字图像作业一。
我的微信公众号名称:小小何先生
公众号介绍:主要研究分享深度学习、机器博弈、强化学习等相关内容!期待您的关注,欢迎一起学习交流进步!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。