利用高斯滤波对曲线进行平滑处理

// 对空间曲线的每个维度应用高斯滤波器进行平滑
std::vector<DataExportPoint<double>> SmoothSpatialCurve(const std::vector<DataExportPoint<double>>& curve, int kernel_size, double sigma) {
    
    std::vector<DataExportPoint<double>> smoothed_curve(curve.size()); // 创建一个新的存储平滑后曲线的空间
    //cv::Mat1d 是 OpenCV 的模板类,其中的 1d 部分表示矩阵的维度为1,即一维矩阵。所以 cv::Mat1d 实际上是一个包含双精度浮点型数据的一维矩阵。
    cv::Mat1d xData(curve.size(), 1);//创建一个curve.size()行,1列的矩阵
    cv::Mat1d yData(curve.size(), 1);
    cv::Mat1d zData(curve.size(), 1);
    // 将三维数据转换为OpenCV矩阵格式
    for (size_t i = 0; i < curve.size(); ++i) {
        xData(i, 0) = curve[i].x_;
        yData(i, 0) = curve[i].y_;
        zData(i, 0) = curve[i].z_;
    }
    // 创建一个高斯核   sigma为高斯函数的标准差,控制了高斯分布的宽度   CV_64F: 指定生成的高斯核的数据类型为双精度浮点型(64 位浮点数)
    cv::Mat1d gauss_kernel = cv::getGaussianKernel(kernel_size, sigma, CV_64F);
    // 高斯滤波器(实际上是卷积)
    cv::Mat1d newXData, newYData, newZData;//存储滤波后的数据

    //对输入数据矩阵 xData,yData,zData 进行二维分离滤波操作, 利用了预先生成的高斯核 gauss_kernel 对数据进行水平和垂直方向的平滑处理
    //-1 表示输出图像与输入图像具有相同的深度  gauss_kernel 分别为水平方向与垂直方向的滤波核
    cv::sepFilter2D(xData, newXData, -1, gauss_kernel, gauss_kernel);
    cv::sepFilter2D(yData, newYData, -1, gauss_kernel, gauss_kernel);
    cv::sepFilter2D(zData, newZData, -1, gauss_kernel, gauss_kernel);
    // 将平滑后的数据转换回结构体
    for (size_t i = 0; i < curve.size(); ++i) {
        smoothed_curve[i] = {newXData(i, 0), newYData(i, 0), newZData(i, 0)};
    }
    return smoothed_curve;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值