C++实现点云添加高斯噪声功能

0 添加高斯噪声后的点云

红色为添加的高斯噪声点,白色为原始点

1 什么是高斯噪声

高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声。(百度百科

高斯分布,也称正态分布,又称常态分布,记为 N ( μ , σ 2 ) ),其中 μ , σ 2 为分布的参数,分别为高斯分布的期望和方差,其中 σ > 0 ,称为标准差。当 μ , σ 有确定值时,p ( x ) 也就确定了,特别当 μ = 0 , σ 2 = 1时,x 的分布为标准正态分布。

高斯分布函数

2 怎样添加高斯噪声

磨刀不误砍柴工,将添加高斯噪声封装到 CreatGaussNoise类 中,只需在main.cpp中设置输入点云(要添加噪声的点云)、设置高斯噪声参数(μ , σ)即可。

实现代码

main.cpp

#include "add_gauss_noise.h"

int main()
{
	//-------------------加载点云-------------------
	pcl::PointCloud<pcl::PointXYZ> cloud_in;
	if (pcl::io::loadPCDFile("Armadillo.pcd", cloud_in) < 0)
	{
		PCL_ERROR("->点云文件不存在!\a\n");
		system("pause");
		return -1;
	}

	//-------------------添加高斯噪声-------------------
	AddGaussNoise agn;							//创建高斯噪声对象agn
	pcl::PointCloud<pcl::PointXYZ> cloud_out;	//保存结果的点云
	agn.setInputCloud(cloud_in);				//设置输入点云
	agn.setParameters(0,2);						//设置高斯噪声参数mu,sigma
	agn.addGaussNoise(cloud_out);				//执行添加高斯噪声,并将结果保存在cloud_out中

	//-------------------保存添加高斯噪声后的点云-------------------
	pcl::io::savePCDFileBinary("addGaussNoise.pcd", cloud_out);

	return 0;
}

add_gauss_noise.h

#pragma once
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <boost/random.hpp>		//随机数所需头文件

class AddGaussNoise
{
public:

	/**
	* @brief   : 设置输入点云
	* @param[I]: cloud_in (输入点云)
	* @param[O]: none
	* @return  : none
	* @note    :
	**/
	void setInputCloud(pcl::PointCloud<pcl::PointXYZ> &cloud_in);

	/**
	* @brief   : 设置高斯噪声参数
	* @param[I]: mu (均值,默认0)
	* @param[I]: sigma (标准差,默认1)
	* @param[O]: none
	* @return  : none
	* @note    :
	**/
	void setParameters(double mu = 0.0, double sigma = 1.0);

	/**
	* @brief   : 执行添加高斯噪声
	* @param[I]: cloud_out (添加高斯噪声后的点云)
	* @param[O]: none
	* @return  : none
	* @note    :
	**/
	void addGaussNoise(pcl::PointCloud<pcl::PointXYZ> &cloud_out);
private:

	pcl::PointCloud<pcl::PointXYZ> m_cloud_in;		//输入点云
	bool is_setInputCloud = false;					//是否设置输入点云
	double m_mu, m_sigma;							//高斯分布参数
	bool is_setParameters = false;					//是否设置高斯分布参数
};

add_gauss_noise.cpp

#include "add_gauss_noise.h"

/**
* @brief   : 设置输入点云
* @param[I]: cloud_in (输入点云)
* @param[O]: none
* @return  : none
* @note    :
**/
void AddGaussNoise::setInputCloud(pcl::PointCloud<pcl::PointXYZ> &cloud_in)
{
	m_cloud_in = cloud_in;
	is_setInputCloud = true;
}

/**
* @brief   : 设置高斯噪声参数
* @param[I]: mu (均值,默认0)
* @param[I]: sigma (标准差,默认1)
* @param[O]: none
* @return  : none
* @note    :
**/
void AddGaussNoise::setParameters(double mu, double sigma)
{
	if (sigma > 0)
	{
		m_mu = mu;
		m_sigma = sigma;
		is_setParameters = true;
	}
	else
	{
		PCL_ERROR("->sigma应大于0!\a\n");
		system("pause");
		abort();
	}
}

/**
* @brief   : 执行添加高斯噪声
* @param[I]: cloud_out (添加高斯噪声后的点云)
* @param[O]: none
* @return  : none
* @note    :
**/
void AddGaussNoise::addGaussNoise(pcl::PointCloud<pcl::PointXYZ> &cloud_out)
{
	boost::mt19937 zgy;								//等分布均匀伪随机数发生器
	zgy.seed(static_cast<unsigned int>(time(0)));	//随机种子
	boost::normal_distribution<> nd(m_mu, m_sigma);	//定义正态分布,均值为mu,标准差为sigma
	boost::variate_generator<boost::mt19937&, boost::normal_distribution<>> gauss_noise(zgy, nd);	//生成高斯噪声

	pcl::PointCloud<pcl::PointXYZ> cloud_gauss;	//声明高斯噪声点云
	cloud_gauss = m_cloud_in;					//将原始点云拷贝给高斯噪声点云,用于下面的平移				

	for (size_t i = 0; i < cloud_gauss.size(); i++)
	{
		cloud_gauss.points[i].x += static_cast<float> (gauss_noise());
		cloud_gauss.points[i].y += static_cast<float> (gauss_noise());
		cloud_gauss.points[i].z += static_cast<float> (gauss_noise());
	}

	cloud_out = m_cloud_in + cloud_gauss;	//将原始点云与噪声点云合并,得到添加高斯噪声后的点云
}

参考链接

C++ normal_distribution高斯正态分布函数用法详解

总结

到此这篇关于C++实现点云添加高斯噪声功能的文章就介绍到这了,更多相关C++点云高斯噪声内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++实现点云添加高斯噪声功能

    0 添加高斯噪声后的点云 红色为添加的高斯噪声点,白色为原始点 1 什么是高斯噪声 高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声.(百度百科) 高斯分布,也称正态分布,又称常态分布,记为 N ( μ , σ 2 ) ),其中 μ , σ 2 为分布的参数,分别为高斯分布的期望和方差,其中 σ > 0 ,称为标准差.当 μ , σ 有确定值时,p ( x ) 也就确定了,特别当 μ = 0 , σ 2 = 1时,x 的分布为标准正态分布. 高斯分布函数 2 怎样添加高斯噪声 磨

  • Python实现对图像添加高斯噪声或椒盐噪声

    目录 内容简介 加噪声的代码(高斯噪声,椒盐噪声) 在pytorch中如何使用 内容简介 展示如何给图像叠加不同等级的椒盐噪声和高斯噪声的代码,相应的叠加噪声的已编为对应的类,可实例化使用.以下主要展示自己编写的: 加噪声的代码(高斯噪声,椒盐噪声) add_noise.py #代码中的noisef为信号等级,例如我需要0.7的噪声,传入参数我传入的是1-0.7 from PIL import Image import numpy as np import random import torch

  • 利用python3如何给数据添加高斯噪声

    目录 Background 原始数据 源码 总结 Background 高斯噪声,顾名思义是指服从高斯分布(正态分布)的一类噪声.有的时候我们需要向标准数据中加入合适的高斯噪声让数据更加符合实际. python中的random库中集成了高斯正态分布,可以直接使用. 我们可以通过调整高斯噪声均值和方差,获取不同效果的处理数据. 原始数据 高斯噪声sigma = 0.05 高斯噪声sigma = 0.1 高斯噪声sigma = 0.15 源码 import random import numpy a

  • 如何利用python正确地为图像添加高斯噪声

    目录 彩图or灰度图 uint8orfloat64 方差or标准差 是否截断(clip) 总结 参考 开门见山,直接使用 skimage 库为图像添加高斯噪声是很简单的: import skimage origin = skimage.io.imread("./lena.png") noisy = skimage.util.random_noise(origin, mode='gaussian', var=0.01) 但是如果不用库函数而自己实现的话,有几个问题是值得注意的. 彩图 o

  • 使用Python-OpenCV向图片添加噪声的实现(高斯噪声、椒盐噪声)

    在matlab中,存在执行直接得函数来添加高斯噪声和椒盐噪声.Python-OpenCV中虽然不存在直接得函数,但是很容易使用相关的函数来实现. 代码: import numpy as np import random import cv2 def sp_noise(image,prob): ''' 添加椒盐噪声 prob:噪声比例 ''' output = np.zeros(image.shape,np.uint8) thres = 1 - prob for i in range(image.

  • Python实现图像随机添加椒盐噪声和高斯噪声

    目录 1.常见的图像噪声 (1)高斯噪声 (2) 椒盐噪声 2.生成图像噪声 (1)高斯噪声 (2) 椒盐噪声(速度慢) (3) 椒盐噪声(快速版) 3. Demo性能测试 图像噪声是指存在于图像数据中的不必要的或多余的干扰信息.在噪声的概念中,通常采用信噪比(Signal-Noise Rate, SNR)衡量图像噪声.通俗的讲就是信号占多少,噪声占多少,SNR越小,噪声占比越大. 1.常见的图像噪声 (1)高斯噪声 高斯噪声Gaussian noise,是指它的概率密度函数服从高斯分布(即正态

  • OpenCV实现高斯噪声

    本文实例为大家分享了OpenCV实现高斯噪声的具体代码,供大家参考,具体内容如下 OpenCV 中提供了fill()函数可以产生均匀分布或者高斯分布(正态分布)的随机数,我们可以利用该函数产生符合高斯分布的随机数,之后在图像中加入这些随机数即可 void fill( InputOutputArray mat, int distType, InputArray a, InputArray b, bool saturateRange = false ); mat:用于存放随机数的矩阵,目前只支持低于

  • Python实现对图像加噪(高斯噪声 椒盐噪声)

    目录 内容简介 加噪声的代码(高斯噪声,椒盐噪声) 在pytorch中如何使用 补充 内容简介 展示如何给图像叠加不同等级的椒盐噪声和高斯噪声的代码,相应的叠加噪声的已编为对应的类,可实例化使用.以下主要展示自己编写的: 加噪声的代码(高斯噪声,椒盐噪声) add_noise.py #代码中的noisef为信号等级,例如我需要0.7的噪声,传入参数我传入的是1-0.7 from PIL import Image import numpy as np import random import to

  • Android如何使用Bmob后端云实现失物招领功能

    最近在使用后端云Bmob对数据进行存储,目的是在不搭建服务器的前提下,能对Android应用的数据进行操作处理,其实这篇是比较久之前写的了,有些童鞋反馈说现在的源码会有问题,所以我又重新运行了一下,随着Bmob版本的更新,之前的源码跑不起来,现在重新更新了最新版本做了个Demo. 实现步骤: 一.创建账号 需要的自己去注册,后端云Bmob首页地址:https://www.bmob.cn/ 二.网站后台创建应用(如图) 这里使用的是免费版的 创建成功之后点击创建的应用进去,在设置->应用秘钥中可以

  • 小程序通过小程序云实现微信支付功能实例

    目录 一.开通微信支付 1.1 关联商户号 1.2 添加商户号 1.3 管理员授权 二.云函数开发 2.1 新建云函数 2.2 云函数代码 2.3 云函数上传并部署 三.小程序调用 3.1 统一下单 3.2 支付成功回调 一.开通微信支付 1.1 关联商户号 \微信公众号平台\功能\微信支付\商户号管理\关联商户号 1.2 添加商户号 \云开发平台\设置\其他设置\微信支付配置\添加商户号 1.3 管理员授权 1.2那张图上,点击授权.管理员的微信就会跳出提示,点击确定授权即可. 否则使用的时候

随机推荐