C++实现二维高斯滤波

C++实现二维高斯滤波

高斯滤波器

高斯滤波器是一种常用于图像处理和计算机视觉领域的平滑滤波器。它利用高斯函数来对图像中的像素进行加权平均,以达到降低噪声和细节平滑的目的。

高斯滤波器的应用

  1. 去噪:通过平滑图像中的像素,可以减少随机噪声的影响,提高图像质量。
  2. 尺度空间变换:通过在不同的尺度下应用高斯滤波器,可以检测不同大小的图像结构,例如边缘、斑点等。
  3. 图像预处理:在一些计算机视觉任务中,如特征提取或目标检测之前,对图像进行平滑可以提高后续算法的稳定性和准确性。

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/21e21(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,x3xN]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维协方差矩阵,描述各个随机变量之间的关系
    高斯分布的性质:
  1. 中心对称性:类似于一维和二维高斯分布,N维高斯分布也是中心对称的,均值 μ 是分布的中心。
  2. 尺度控制:协方差矩阵 Σ 决定了分布的形状和尺度,不同的 Σ 会导致不同的椭球形状。
  3. 关联性:协方差矩阵描述了随机变量之间的关系。如果协方差矩阵的元素为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[(XE[X])(E(YE[Y])]
协方差的性质:

  1. 正相关和负相关:如果 X 偏大时,Y 也偏大,或者 X 偏小时,Y 也偏小,那么协方差为正值,表示正相关。反之,如果 X 偏大时,Y 偏小,或者 X 偏小时,Y 偏大,那么协方差为负值,表示负相关。
  2. 无关性和独立性:如果两个变量的协方差接近于0,不能确定它们是否无关或独立。协方差为0只是表示它们的线性关系较弱,但不代表完全独立。
  3. 尺度影响:协方差的值受变量尺度的影响。因为协方差是由变量与其均值之间的偏差乘积计算得出的,所以变量的单位会影响协方差的大小。为了消除这种影响,通常会使用相关系数来度量变量之间的关系,相关系数是协方差除以两个变量的标准差的乘积。

二维高斯分布

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[(x1u1)(x1u1)]=σ12

假设 x 1 和 x 2 x_{1}和x_{2} x1x2相互独立:

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(x1u1)2+σ22(x2u2)2)]

高斯滤波器

对于二维矩阵,可以设计如下高斯滤波器(该滤波器中在 x 1 和 x 2 x_{1}和x_{2} x1x2变量得均值为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;
            }
        }
    }
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值