一、双边滤波原理
双边滤波(Bilateral Filter)是非线性滤波中的一种。这是一种结合图像的空间邻近度与像素值相似度的处理办法。在滤波时,该滤波方法同时考虑空间临近信息与颜色相似信息,在滤除噪声、平滑图像的同时,又做到边缘保存。
双边滤波采用了两个高斯滤波的结合。一个负责计算空间邻近度的权值,也就是常用的高斯滤波器原理。而另一个负责计算像素值相似度的权值。在两个高斯滤波的同时作用下,就是双边滤波。
如上图所示,双边滤波的图像边缘信息被较好的保留,而高斯滤波的边缘信息则十分模糊。
二、双边滤波公式
g ( i , j ) = ∑ ( k , l ) ∈ S ( i , j ) f ( k , l ) w ( i , j , k , l ) ∑ ( k , l ) ∈ S ( i , j ) w ( i , j , k , l ) g(i,j)= {\frac {\sum_{(k,l)\in S(i,j)}f(k,l)w(i,j,k,l)} {\sum_{\substack{(k,l)\in S(i,j)}}w(i,j,k,l)} } g(i,j)=∑(k,l)∈S(i,j)w(i,j,k,l)∑(k,l)∈S(i,j)f(k,l)w(i,j,k,l)
S(i, j):指以 (i, j) 为中心的 (2N+1)x(2N+1) 的大小的范围;
f(k, l):(多个) 输入点;
w(i, j, k, l):代表经过两个高斯函数计算出的值(这里还不是权值)
g(i, j):输出点;
上述公式我们进行转化,假设公式中 w(i,j,k,l) 为 m,则有
g
(
i
,
j
)
=
f
1
∗
m
1
+
f
2
∗
m
2
+
⋯
+
f
n
∗
m
n
m
1
+
m
2
+
⋯
+
m
n
g(i,j)= {\frac {f_1*m_1+f_2*m_2+ \cdots +f_n*m_n} {m_1+m_2+ \cdots +m_n} }
g(i,j)=m1+m2+⋯+mnf1∗m1+f2∗m2+⋯+fn∗mn
设
m
1
+
m
2
+
m
3
…
+
m
n
=
M
m_1+m_2+m_3 … +m_n = M
m1+m2+m3…+mn=M,则有
g
(
i
,
j
)
=
f
1
∗
m
1
M
+
f
2
∗
m
2
M
+
⋯
+
f
n
∗
m
n
M
g(i,j) = f_1 * {\frac {m_1} M} + f_2 * {\frac {m_2} M} + \cdots + f_n * {\frac {m_n} M}
g(i,j)=f1∗Mm1+f2∗Mm2+⋯+fn∗Mmn
此时可以看到,这明显是图像矩阵与核的卷积运算了。其中 m1/M 代表的第一个点(或最后一个点,看后面如何实现)的权值,而图像矩阵与核通过卷积算子作加权和,最终得到输出值。
接下来我们来讨论最关键的w(i, j, k, l), ws为空间临近高斯函数,wr为像素值相似度高斯函数
w
=
w
s
∗
w
r
w = w_s *w_r
w=ws∗wr
w
s
=
e
−
(
i
−
k
)
2
+
(
j
−
l
)
2
2
σ
s
2
w_s = e^{-{\frac {(i-k)^2+(j-l)^2}{2\sigma_s^2}}}
ws=e−2σs2(i−k)2+(j−l)2
w
r
=
e
−
∣
∣
f
(
i
,
j
)
−
f
(
k
,
l
)
∣
∣
2
2
σ
r
2
w_r = e^{-{\frac {||f(i,j)-f(k,l)||^2} {2\sigma_r^2}}}
wr=e−2σr2∣∣f(i,j)−f(k,l)∣∣2 可以看到,对于
w
s
w_s
ws 来说,这就是普通的高斯滤波函数,其代入的坐标,
σ
s
\sigma_s
σs 是程序输入值,该函数是在空间临近度上计算的。而
w
r
w_r
wr 是计算像素值相似度(颜色空间),注意,这就是高斯函数代入坐标值,
2
σ
r
2
2\sigma_r^2
2σr2 的上方是范数,在这里的值为
∣
∣
f
(
i
,
j
)
−
f
(
k
,
l
)
∣
∣
2
||f(i,j)-f(k,l)||^2
∣∣f(i,j)−f(k,l)∣∣2 。也就是两个点像素值差值的绝对值的平方。其中,彩色图片计算差值时应将(i,j)点的RGB三通道值之和减去(k,l)点的RGB三通道值之和。这里是颜色空间计算,不能当成单通道,但是在最后矩阵卷积时,是单通道与权值相乘而不是三个通道之和。
总之,对于与模版中心点像素值相差较大的像素点来说,模板系数受高斯核的影响越小。反之,影响就越大。因此,对于不同种类的噪声点,可以联合调节 Ws和Wr的大小,使得双边滤波模版既能滤除掉图中的噪声点,又能较好地保存边缘信息。
三、bilateralFilter 函数
OpenCV还给出了简单的函数形式:
CV_EXPORTS_W void bilateralFilter( InputArray src, OutputArray dst, int d,
double sigmaColor, double sigmaSpace,
int borderType = BORDER_DEFAULT );
src : 原图, 8为整形或浮点型,单通道或者3通道;
dst : 与原图同样尺寸,但不能是原图;
d : 滤波核的直径;
sigmaColor :
σ
r
\sigma_r
σr
sigmaSpace :
σ
s
\sigma_s
σs
borderType : 用于设置图像边界元素的方式
双边滤波的效果(来自网络图片)
文章来源:https://www.toymoban.com/news/detail-460278.html
本文第一、二部分转载自 OpenCV双边滤波详解及实代码实现文章来源地址https://www.toymoban.com/news/detail-460278.html
到了这里,关于opencv-双边滤波的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!