C++实现二维高斯滤波
高斯滤波器
高斯滤波器是一种常用于图像处理和计算机视觉领域的平滑滤波器。它利用高斯函数来对图像中的像素进行加权平均,以达到降低噪声和细节平滑的目的。
高斯滤波器的应用
- 去噪:通过平滑图像中的像素,可以减少随机噪声的影响,提高图像质量。
- 尺度空间变换:通过在不同的尺度下应用高斯滤波器,可以检测不同大小的图像结构,例如边缘、斑点等。
- 图像预处理:在一些计算机视觉任务中,如特征提取或目标检测之前,对图像进行平滑可以提高后续算法的稳定性和准确性。
N维高斯分布
N维高斯分布(或多维高斯分布)是一个在N维空间中定义的概率分布函数,也被称为多元正态分布。它是一种常见的统计分布,用于描述多个随机变量的联合分布,具有许多重要的数学和统计性质。
N维高斯分布的概率密度函数表达式如下:
f ( x ) = 1 ( 2 π ) N / 2 ∣ Σ ∣ 1 / 2 e − 1 2 ( x − μ ) T Σ − 1 ( x − μ ) f(\mathbf{x})=\frac{1}{(2\pi)^{N/2}|\Sigma|^{1/2}}e^{-\frac{1}{2}(\mathbf{x}-\mu)^T\Sigma^{-1}(\mathbf{x}-\mu)} f(x)=(2π)N/2∣Σ∣1/21e−21(x−μ)TΣ−1(x−μ)
- x = [ x 1 , x 2 , x 3 … x N ] T x=[x_{1},x_{2},x_{3}\dots x_{N}]^T x=[x1,x2,x3…xN]T是一个N维列向量,表示随机变量的取值
- μ = [ μ 1 , μ 2 , μ 3 … μ N ] T \mu = [\mu_{1},\mu_{2},\mu_{3}\dots \mu _{N}]^T μ=[μ1,μ2,μ3…μN]T是一个N维列向量,表示均值向量
-
Σ
\Sigma
Σ是一个N维协方差矩阵,描述各个随机变量之间的关系
高斯分布的性质:
- 中心对称性:类似于一维和二维高斯分布,N维高斯分布也是中心对称的,均值 μ 是分布的中心。
- 尺度控制:协方差矩阵 Σ 决定了分布的形状和尺度,不同的 Σ 会导致不同的椭球形状。
- 关联性:协方差矩阵描述了随机变量之间的关系。如果协方差矩阵的元素为0,表示随机变量相互独立
协方差
协方差是一种用来度量两个随机变量之间关系的统计量,它描述了这两个变量的变化趋势是否一致。具体来说,协方差表示的是两个随机变量偏离各自均值的程度的乘积的期望。
对两个随机变量X和Y,两者之间的协方差:
C
o
v
(
X
,
Y
)
=
E
[
(
X
−
E
[
X
]
)
(
E
(
Y
−
E
[
Y
]
)
]
Cov(X,Y) = E[(X-E[X])(E(Y-E[Y])]
Cov(X,Y)=E[(X−E[X])(E(Y−E[Y])]
协方差的性质:
- 正相关和负相关:如果 X 偏大时,Y 也偏大,或者 X 偏小时,Y 也偏小,那么协方差为正值,表示正相关。反之,如果 X 偏大时,Y 偏小,或者 X 偏小时,Y 偏大,那么协方差为负值,表示负相关。
- 无关性和独立性:如果两个变量的协方差接近于0,不能确定它们是否无关或独立。协方差为0只是表示它们的线性关系较弱,但不代表完全独立。
- 尺度影响:协方差的值受变量尺度的影响。因为协方差是由变量与其均值之间的偏差乘积计算得出的,所以变量的单位会影响协方差的大小。为了消除这种影响,通常会使用相关系数来度量变量之间的关系,相关系数是协方差除以两个变量的标准差的乘积。
二维高斯分布
设
x
=
[
x
1
,
x
2
]
,
u
=
[
u
1
,
u
2
]
,
σ
2
=
[
σ
1
2
,
σ
2
2
]
x = [x_{1},x_{2}], u=[u_{1},u_{2}], \sigma^2 = [\sigma_{1}^2, \sigma_{2}^2]
x=[x1,x2],u=[u1,u2],σ2=[σ12,σ22]为该向量的参数
计算各个变量之间得协方差如下:
C o v ( x 1 , x 1 ) = E [ ( x 1 − u 1 ) ( x 1 − u 1 ) ] = σ 1 2 Cov(x1,x1) = E[(x_{1}-u_{1})(x_{1}-u_{1})] = \sigma_{1}^2 Cov(x1,x1)=E[(x1−u1)(x1−u1)]=σ12
假设 x 1 和 x 2 x_{1}和x_{2} x1和x2相互独立:
C
o
v
(
x
1
,
x
2
)
=
0
Cov(x_{1},x_{2}) = 0
Cov(x1,x2)=0
则协方差矩阵是:
{
σ
1
2
0
0
σ
2
2
}
\begin{Bmatrix} \sigma_{1}^2 & 0 \\ 0 & \sigma_{2}^2 \end{Bmatrix}
{σ1200σ22}
带入N维高斯分布得:
f
(
x
)
=
1
2
π
σ
1
σ
2
exp
[
−
1
2
(
(
x
1
−
u
1
)
2
σ
1
2
+
(
x
2
−
u
2
)
2
σ
2
2
)
]
f(x) = \frac{1}{2\pi\sigma_{1}\sigma_{2}}\exp[{-\frac{1}{2}\left( \frac{(x_{1}-u_{1})^2}{\sigma_{1}^2} +\frac{(x_{2}-u_{2})^2}{\sigma_{2}^2}\right)}]
f(x)=2πσ1σ21exp[−21(σ12(x1−u1)2+σ22(x2−u2)2)]
高斯滤波器
对于二维矩阵,可以设计如下高斯滤波器(该滤波器中在
x
1
和
x
2
x_{1}和x_{2}
x1和x2变量得均值为0,方差相等):
f
(
x
)
=
1
2
π
σ
2
exp
[
−
x
1
2
+
x
2
2
2
σ
2
]
f(x) = \frac{1}{2\pi \sigma^2}\exp\left[ -\frac{x_{1}^2+x_{2}^2}{2\sigma^2} \right]
f(x)=2πσ21exp[−2σ2x12+x22]
C++设计高斯滤波器:
double gaussian(double x, double y, double sigma){
return exp(-(x*x + y*y)/(2*sigma*sigma))*(1/(2*M_PI*sigma*sigma));
}
对二维数据进行滤波:
void gaussianfilter2D(vector<vector<double>>& data_input, vector<vector<double>>& data_output,double sigma)
{
int radius = static_cast<int>(3*sigma);
int size = 2 * radius + 1;
double value = 0.0;
int nx = data_input.size();
int nt = data_input[0].size();
// 初始化一个高斯滤波器
vector<vector<double>> kernel(size, vector<double>(size));
// 获取高斯滤波器
double sum = 0.0;
for(int i = -radius; i <= radius; i++){
for(int j = -radius; j <= radius; j++){
kernel[j + radius][j + radius] = gaussian(i, j, sigma);
sum += kernel[i + radius][j + radius];
}
}
for(int i = 0; i < size; i++){
for(int j = 0; j < size; j++){
kernel[i][j] /= sum;
}
}
for(int i = radius; i < nx - radius; i++){
for(int j = radius; j < nt - radius; j++){
value = 0.0;
for(int m = -radius; m <= radius; m++){
for(int n = -radius; n <= radius; n++){
value += kernel[m + radius][n + radius] * data_input[i + m][j + n];
}
}
data_output[i][j] = value;
}
}
}