高斯函数与高斯滤波
一维高斯函数:
G
(
x
)
=
1
2
π
σ
e
x
p
(
−
(
x
−
μ
)
2
2
σ
2
)
G(x)=\frac{1}{\sqrt{2 \pi} \sigma} exp(- \frac{{(x-\mu)}^2}{2\sigma^2})
G(x)=2πσ1exp(−2σ2(x−μ)2)
二维高斯函数为两个一维高斯函数的积:
G
(
x
,
y
)
=
1
2
π
σ
e
x
p
(
−
(
x
−
μ
x
)
2
2
σ
x
2
−
(
y
−
μ
y
)
2
2
σ
y
2
)
G(x,y)=\frac{1}{\sqrt{2 \pi} \sigma} exp(- \frac{{(x-\mu_x)}^2}{2\sigma_x^2}-\frac{{(y-\mu_y)}^2}{2\sigma_y^2})
G(x,y)=2πσ1exp(−2σx2(x−μx)2−2σy2(y−μy)2)
高斯滤波即用某一尺寸的二维高斯核与图像进行卷积。高斯核是对连续高斯函数的离散近似,通常对高斯曲面进行离散采样和归一化得出(归一化指的是卷积核所有元素之和为1),下图为标准高斯和
σ
x
=
σ
y
=
1.4
\sigma_x=\sigma_y=1.4
σx=σy=1.4大小为
5
×
5
5\times5
5×5的高斯核。
标准差
当
μ
=
0
\mu=0
μ=0时,唯一需要控制的参数就是标准差
σ
\sigma
σ,调整σ\sigma实际是在调整周围像素对当前像素的影响程度,调大σ\sigma即提高了远处像素对中心像素的影响程度,滤波结果也就越平滑。高斯曲线随σ\sigma变化的曲线如下:
从频域角度看,高斯函数的傅立叶变换仍是高斯,两者标准差间的关系如下:
σ x = 1 2 π σ w \sigma_x = \frac{1}{2\pi \sigma_w} σx=2πσw1
其中,
σ
x
\sigma_x
σx为空域高斯的标准差,
σ
w
\sigma_w
σw为对应频域高斯的标准差,在空域进行高斯平滑相当于频域低通滤波,
σ
x
\sigma_x
σx越大,
σ
w
\sigma_w
σw越小,频域高斯越集中,高频成分削弱得越多,图像越平滑。
从低通滤波角度考虑,可以对图像做傅立叶变换进行频谱分析,叠加上频域高斯并调整查看效果,找到适合的
σ
w
\sigma_w
σw,再推算出空域高斯所需的
σ
x
\sigma_x
σx。
窗口大小
标准差
σ
\sigma
σ确定后,接下来需要确定窗口大小。上面讲了高斯核是对连续高斯的离散近似,窗口越大自然近似越好,但高斯函数是钟形曲线,距离中心越远数值越小,足够远处可以忽略不计,但多远算远呢?
钟型曲线在区间
(
μ
−
σ
,
μ
+
σ
)
(\mu - \sigma, \mu +\sigma)
(μ−σ,μ+σ)范围内的面积占曲线下总面积的
68
%
68\%
68%,
(
μ
−
2
σ
,
μ
+
2
σ
)
(\mu - 2\sigma, \mu +2\sigma)
(μ−2σ,μ+2σ)范围占
95
%
95\%
95%,
(
μ
−
3
σ
,
μ
+
3
σ
)
(\mu - 3\sigma, \mu +3\sigma)
(μ−3σ,μ+3σ)范围占
99.7
%
99.7\%
99.7%,一般
3
σ
3\sigma
3σ外的数值已接近于0,可忽略,半径为
3
σ
3\sigma
3σ即窗口大小为
6
σ
×
6
σ
6\sigma \times 6\sigma
6σ×6σ即可,通常取最近的奇数。上述3个范围在一维和二维高斯中示意如下:
OpenCV中标准差与窗口大小的换算
在OpenCV函数createGaussianFilter中,若未指定窗口大小,通过
σ
\sigma
σ推算窗口大小方式如下,半径为
σ
\sigma
σ的3或4倍:
若指定了窗口大小,但未指定
σ
\sigma
σ大小,则通过窗口大小推算
σ
\sigma
σ的方式如下:
σ
=
0.3
×
(
(
k
s
i
z
e
−
1
)
×
0.5
−
1
)
+
0.8
\sigma = 0.3\times((ksize - 1)\times0.5 - 1) + 0.8
σ=0.3×((ksize−1)×0.5−1)+0.8
σ
=
0.15
×
k
s
i
z
e
+
0.35
\sigma = 0.15\times ksize + 0.35
σ=0.15×ksize+0.35
σ
=
0.3
×
(
k
s
i
z
e
2
+
1
)
\sigma = 0.3 \times {(\frac{ksize}{2}+1) }
σ=0.3×(2ksize+1)
具体地,在函数getGaussianKernel中,当ksize不大于7时,直接从内部的small_gaussian_tab取对应大小的高斯核,若大于7,则使用上式计算出 σ \sigma σ然后套用高斯公式,最后再归一化。