点云RGB中值滤波

文章介绍了如何利用PCL库中的中值滤波方法对RGB点云数据进行去噪处理。通过设定搜索半径,对每个点的邻域点按颜色分量进行排序,选取中间值作为新点的颜色值,以此达到滤波效果。代码示例中采用了多线程加速处理过程。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:
扫描后得到的点云可能存在噪点,可以通过中值滤波对rgb进行去噪。


提示:以下是本篇文章正文内容,下面案例可供参考

一、原理简介

  • 和图像的中值滤波一样,判断一个点周围领域的点,对领域点的像素值大小进行排序。取排序中间的像素值代替所选点

二、代码简介

void MedianFilter(pcl::PointCloud<PointT>::Ptr &input,pcl::PointCloud<PointT>::Ptr &output)
{
    pcl::PointCloud<PointT>::Ptr cloud(new pcl::PointCloud<PointT>);
    pcl::search::KdTree<PointT>::Ptr tree(new pcl::search::KdTree<PointT>);
    tree->setInputCloud(input);
    std::vector<int> pointIdxRadiusSearch;
    std::vector<float> pointIdxRadiusSquaredDistance;
    float radius = 0.02;
    // 多线程
#pragma omp parallel for
    for (int i=0;i<input->points.size();i++)
    {
        tree->radiusSearch(input->points[i],radius,pointIdxRadiusSearch,pointIdxRadiusSquaredDistance);
        
        std::vector<int> r_indice(pointIdxRadiusSquaredDistance.size());
        std::vector<int> g_indice(pointIdxRadiusSquaredDistance.size());
        std::vector<int> b_indice(pointIdxRadiusSquaredDistance.size());
        std::iota(r_indice.begin(),r_indice.end(),0);
        std::iota(g_indice.begin(),g_indice.end(),0);
        std::iota(b_indice.begin(),b_indice.end(),0);
        std::sort(r_indice.begin(), r_indice.end(),[&pointIdxRadiusSearch,&input](int lhs, int rhs){
                return input->points[pointIdxRadiusSearch[lhs]].r > input->points[pointIdxRadiusSearch[rhs]].r;
            }); //排序由大到小
        std::sort(g_indice.begin(), g_indice.end(),[&pointIdxRadiusSearch,&input](int lhs, int rhs){
                return input->points[pointIdxRadiusSearch[lhs]].g > input->points[pointIdxRadiusSearch[rhs]].g;
            }); //排序由大到小
        std::sort(b_indice.begin(), b_indice.end(),[&pointIdxRadiusSearch,&input](int lhs, int rhs){
                return input->points[pointIdxRadiusSearch[lhs]].b > input->points[pointIdxRadiusSearch[rhs]].b;
            }); //排序由大到小
        int mid_r = pointIdxRadiusSearch[r_indice[int(pointIdxRadiusSearch.size() / 2)]];
        int mid_g = pointIdxRadiusSearch[g_indice[int(pointIdxRadiusSearch.size() / 2)]];
        int mid_b = pointIdxRadiusSearch[b_indice[int(pointIdxRadiusSearch.size() / 2)]];
        // int mid_indice = pointIdxRadiusSearch[Idx_indice[0]];
        
        // std::cout<<mid_indice<<std::endl;
        PointT p;
        p.x = input->points[i].x;
        p.y = input->points[i].y;
        p.z = input->points[i].z;
        p.r = input->points[mid_r].r;
        p.g = input->points[mid_g].g;
        p.b = input->points[mid_b].b;
        cloud->points.push_back(p);
    }
    output->points = cloud->points;
}

2.读入数据

代码如下(示例):

data = pd.read_csv(
    'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())

该处使用的url网络请求的数据。


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值