高斯函数与高斯核函数

摘要

图像处理领域中,高斯核函数常用于图像低通滤波,记录下原理,同时用代码实现下。

高斯函数

一维高斯函数

$a, b, c$ 为实数常数, 且 $a>0$

$a$ 为曲线尖峰高度,$b$ 为尖峰的中心位置, $c$ 为钟的宽度

由高斯积分公式,得

令 $y=x-b$, 得 $dx = dy$

令 $z= \frac{y}{\sqrt{2}c}$, 得 $dy = \sqrt{2}cdz$

令 $f(x)=1$,使宽度范围内所有概率为$ 1$,得

令期望 $\mu$ 为 $b$,标准差 $\sigma$ 为 $c$,得满足正态分布的高斯函数

二维高斯函数(高斯分布、正态分布)

$\mu=0$,即原点为中心点

在实际编程应用中,高斯函数中的参数如下

  • ksize 核大小
  • sigma 方差
  • center 尖峰中心点坐标
  • bias 尖峰中心点的偏移量,用于控制截断高斯函数

以下程序递增高斯函数的方差,并将结果图保存为 gif 图像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import numpy as np
import cv2
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
item = 10
dt = 1
ksize = 20
sigma = 2
fig = plt.figure()
plt.ion()
for i in list(range(item)):
center = round(ksize/2)
bias = ksize *10/10
ksigma = np.multiply(cv2.getGaussianKernel(ksize, sigma),
(cv2.getGaussianKernel(ksize,sigma)).T)
[m, n] = ksigma.shape
for x in list(range(m)):
for y in list(range(n)):
if((x<center-bias) or (x>center+bias) or (y<center-bias) or
(y>center+bias)):
ksigma[x, y] = 0
sigma = sigma + dt

ax3 = plt.axes(projection='3d')
ax3.set_zlim3d(0,8e-3)
x = list(range(ksize))
y = x
ax3.plot_surface(x,y,ksigma,cmap='rainbow')
plt.draw()
plt.pause(0.1)

图片如下

随着方差的增大,整个高斯函数的尖峰逐渐减小,整体也变的更加平缓,则对图像的平滑效果越来越明显

保持参数不变,对上述高斯函数进行截断,bias 的大小为 ksize *3/10,则结果如下

bias 的作用主要是对超过一定区域的原始图像信息不再考虑,这就保证在更加合理的利用靠近高斯函数中心点的周围像素,同时还可以改变高斯函数的中心坐标

高斯核函数卷积

径向基函数(Radial Basis Function), 就是某种沿径向对称的标量函数。 通常定义为空间中任一点 $x_1$ 到某一中心 $x_2$ 之间欧氏距离的单调函数,其作用往往是局部的 , 即当 $x_1$ 远离 $x_2$ 时函数取值很小

最常用的一个核函数为高斯核函数,形式为

也称为径向基函数

高斯核函数的代码实现如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import numpy as np

def gaussian_kernel(x1, x2, l=1.0, sigma_f=1.0):
"""Easy to understand but inefficient."""
m, n = x1.shape[0], x2.shape[0]
dist_matrix = np.zeros((m, n), dtype=float)
for i in range(m):
for j in range(n):
dist_matrix[i][j] = np.sum((x1[i] - x2[j]) ** 2)
return sigma_f ** 2 * np.exp(- 0.5 / l ** 2 * dist_matrix)

def gaussian_kernel_vectorization(x1, x2, l=1.0, sigma_f=1.0):
"""More efficient approach."""
dist_matrix = np.sum(x1**2, 1).reshape(-1, 1) + np.sum(x2**2, 1) - 2 * np.dot(x1, x2.T)
return sigma_f ** 2 * np.exp(-0.5 / l ** 2 * dist_matrix)

x = np.array([700, 800, 1029]).reshape(-1, 1)
print(gaussian_kernel_vectorization(x, x, l=500, sigma=10))

输出

1
2
3
[[100.          98.01986733  80.5347031 ]
[ 98.01986733 100. 90.04307671]
[ 80.5347031 90.04307671 100. ]]

高斯函数性质

高斯函数具有五个重要的性质,这些性质使得它在早期图像处理中特别有用。这些性质表明,高斯平滑滤波器无论在空间域还是在频率域都是十分有效的低通滤波器,且在实际图像处理中得到了有效使用。高斯函数具有五个十分重要的性质

  1. 二维高斯函数具有旋转对称性,即滤波器在各个方向上的平滑程度是相同的。一般来说,一幅图像的边缘方向是事先不知道的,因此,在滤波前是无法确定一个方向上比另一方向上需要更多的平滑。旋转对称性意味着高斯平滑滤波器在后续边缘检测中不会偏向任一方向。

  2. 高斯函数是单值函数。这表明,高斯滤波器用像素邻域的加权均值来代替该点的像素值,而每一邻域像素点权值是随该点与中心点的距离单调增减的。边缘是一种图像局部特征,如果平滑运算对离算子中心很远的像素点仍然有很大作用,则平滑运算会使图像失真。

  3. 高斯函数的傅立叶变换频谱是单瓣的。正如下面所示,这一性质是高斯函数傅立叶变换等于高斯函数本身这一事实的直接推论。图像常被不希望的高频信号所污染(噪声和细纹理)。而所希望的图像特征(如边缘),既含有低频分量,又含有高频分量。高斯函数傅立叶变换的单瓣意味着平滑图像不会被不需要的高频信号所污染,同时保留了大部分所需信号。

  4. 高斯滤波器宽度(决定着平滑程度)是由参数 $\sigma$ 表征的,而且 $\sigma$ 和平滑程度的关系是非常简单的。 $\sigma$ 越大,高斯滤波器的频带就越宽,平滑程度就越好。通过调节平滑程度参数 $\sigma$ ,可在图像特征过分模糊(过平滑)与平滑图像中由于噪声和细纹理所引起的过多的不希望突变量(欠平滑)之间取得折衷。

  5. 由于高斯函数的可分离性,大高斯滤波器可以得以有效地实现。二维高斯函数卷积可以分两步来进行,首先将图像与一维高斯函数进行卷积,然后将卷积结果与方向垂直的相同一维高斯函数卷积。因此,二维高斯滤波的计算量随滤波模板宽度成线性增长而不是成平方增长。

- ETX   Thank you for reading -
  • Copyright: All posts on this blog except otherwise stated, All adopt CC BY-NC-ND 4.0 license agreement. Please indicate the source of reprint!