快速的图像边缘滤波算法
高斯双边模糊与mean shift均值模糊两种边缘保留滤波算法,因为计算量比较大,无法实时实现图像边缘保留滤波,限制了它们的使用场景。高斯双边与mean shift均值在计算时候使用五维向量是其计算量大速度慢的根本原因。
OpenCV中还实现了一种快速的边缘保留滤波算法。快速边缘保留滤波是通过积分图像实现局部均方差的边缘保留模糊算法,计算简单而且可以做到计算量跟半径无关。该算法通过等价变换到低维度空间,实现了数据降维与快速计算。
首先局部均方差滤波中计算局部均值的公式:
m
i
,
j
=
1
(
2
n
+
1
)
(
2
m
+
1
)
∑
k
=
i
−
n
n
+
1
∑
l
=
j
−
m
m
+
j
x
k
,
l
m_{i,j}=\frac{1}{(2n+1)(2m+1)}\sum_{k=i-n}^{n+1}\sum_{l=j-m}^{m+j}x_{k,l}
mi,j=(2n+1)(2m+1)1k=i−n∑n+1l=j−m∑m+jxk,l
计算局部方差公式:
v
i
,
j
=
1
(
2
n
+
1
)
(
2
m
+
1
)
∑
k
=
i
−
n
n
+
i
∑
l
=
j
−
m
m
+
j
(
x
k
,
l
−
m
i
,
j
)
2
v_{i,j}=\frac{1}{(2n+1)(2m+1)}\sum_{k=i-n}^{n+i}\sum_{l=j-m}^{m+j}(x_{k,l}-m_{i,j})^2
vi,j=(2n+1)(2m+1)1k=i−n∑n+il=j−m∑m+j(xk,l−mi,j)2
局部均方差的滤波公式如下:
x
i
,
j
−
=
(
1
−
k
i
,
j
)
m
i
,
j
+
k
i
,
j
z
i
,
j
x^-_{i,j}=(1-k_{i,j})m_{i,j}+k_{i,j}z_{i,j}
xi,j−=(1−ki,j)mi,j+ki,jzi,j
其中
z
i
,
j
z_{i,j}
zi,j表示输入图像像素值
系数k的值通过如下计算得到:
k
i
,
j
=
Q
i
,
j
Q
i
,
j
+
σ
1
2
k_{i,j}=\frac{Q_{i,j}}{Q_{i,j}+σ_1^2}
ki,j=Qi,j+σ12Qi,j
当边缘很弱的时候系数K趋近于0、该点的矫正之后的像素值就接近平均值。而当边缘很强的时候系数K趋近于1、该点的模糊之后的像素值就接近等于输入像素值。上述计算中最中意的是窗口内像素的均值与方差,计算均值可以根据积分图像很容易得到,而计算方差根据一系列的数学推导可以得到如下:
V
a
r
(
x
)
=
∑
i
=
1
n
p
i
(
x
i
−
μ
)
2
=
1
n
(
∑
i
=
1
n
x
i
2
−
1
n
(
∑
i
=
1
n
x
i
)
2
)
Var(x)=\sum_{i=1}^np_i(x_i-μ)^2=\frac{1}{n}(\sum_{i=1}^nx_i^2-\frac{1}{n}(\sum_{i=1}^nx_i)^2)
Var(x)=i=1∑npi(xi−μ)2=n1(i=1∑nxi2−n1(i=1∑nxi)2)
就是说可以根据积分图像通过常量次数的计算得到局部的均值与方差,让这种情况下的滤波变成一个常量时间完成的操作与窗口半径大小无关。
算法流程
-
根据输入的图像计算得到积分图像
-
根据输入的半径大小计算窗口内像素均值与方差、计算得到每个像素新的像素值
-
循环每个个像素,重复第2步计算,得到最终的局部均方差滤波图像
OpenCV函数库
-
函数说明
-
函数声明
void edgePreservingFilter( InputArray src, OutputArray dst, int flags = 1, float sigma_s = 60, float sigma_r = 0.4f );
-
函数参数
src 3位的8通道图像 dst 输出的8位彩色通道图像 flags 边缘保留标准,CV::RECURS_FILTER or cv::NORMCONV_FILTER sigma_s 0到200的范围内的浮点数字 sigma_r 0到1范围内的浮点数字 -
应用举例
Mat src = imread("D:/test/reba.jpg"); Mat dst,dst2; edgePreservingFilter(src, dst); edgePreservingFilter(src, dst2, 1,60.0, 0.1); imshow("src", src); imshow("dst_", dst); imshow("dst_r1", dst2); waitKey(0);
sigma_s取值不变时候,sigma_r越大图像滤波效果越明显。
当sigma_r取值不变时候,窗口sigma_s越大图像模糊效果越明显。
当sgma_r取值很小的时候,窗口sigma_s取值无论如何变化,图像双边滤波效果都不好!
学习:
Opencv-快速的图像边缘滤波算法
基于边缘保留滤波实现人脸磨皮的算法
图像处理之积分图应用二(快速边缘保留滤波算法