基于meanshift实现点云聚类附matlab代码

简介: 基于meanshift实现点云聚类附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。

🍎个人主页:Matlab科研工作室

🍊个人信条:格物致知。

更多Matlab仿真内容点击👇

智能优化算法       神经网络预测       雷达通信      无线传感器        电力系统

信号处理              图像处理               路径规划       元胞自动机        无人机

⛄ 内容介绍

MeanShift作为聚类方法之一,在视觉领域有着广泛的应用,尤其是作为深度学习回归后的后处理模块而存在着。

接下来,我们先介绍下基本功能流程,然后会用代码的形式来分析。

一、算法原理:

   MeanShift,顾名思义,由Mean(均值)和shift(偏移)组成。也就是有一个点x,周围有很多点xi,我们计算点x移动到每个点所需要的偏移量之和,求平均,就得到平均偏移量。该偏移量包含大小和方向 ,方向就是周围分布密集的方向。然后点x往平均偏移量方向移动,再以此为新起点,不断迭代直到满足一定条件结束。

中心点就是我们上面所说的 周围的小红点就是 黄色的箭头就是我们求解得到的平均偏移向量。那么图中“大圆圈”是什么东西呢?我们上面所说的周围的点 周围是个什么概念?总的有个东西来限制一下吧。那个“圆圈”就是我们的限制条件,或者说在图像处理中,就是我们搜索迭代时的窗口大小。

步骤1、首先设定起始点  ,我们说了,是球,所以有半径  , 所有在球内的点就是  , 黑色箭头就是我们计算出来的向量  , 将所有的向量  进行求和计算平均就得到我们的meanshift 向量,也就是图中黄色的向量。

接着,再以meanshift向量的重点为圆心,再做一个高维的球,如下图所示,重复上面的步骤,最终就可以收敛到点的分布中密度最大的地方

⛄ 代码

load A     %读取点云数据load POINT  %读取点云边界点数据figure(1);plot3(A(:,1),A(:,2),A(:,3),'g.');hold on;plot3(POINT(:,1),POINT(:,2),POINT(:,3),'r.');OX=[50,0,0]';OY=[0,50,0]';OZ=[0,0,50]';xlabel('X轴');ylabel('Y轴');zlabel('Z轴');axis equal;rotate3d on;quiver3(0,0,0,OX(1),OX(2),OX(3),'color',[1 0 0 ],'LineWidth',2);quiver3(0,0,0,OY(1),OY(2),OY(3),'color',[0 1 0 ],'LineWidth',2);quiver3(0,0,0,OZ(1),OZ(2),OZ(3),'color',[0 0 1 ],'LineWidth',2);title('原始点云与边界点')hold off;[cc]=Mean_shift_7171(POINT,A);    %对边界点聚类,返回值为每个类簇的中心
function [CC]=Mean_shift_7171(c,A)data=c;%mean shift 算法  [m,n]=size(data);  index=1:m;  radius=10;                         %搜索半径设定stopthresh=1e-3*radius;    %阈值设定visitflag=zeros(m,1);%标记是否被访问  count=[];  clustern=0;  clustercenter=[];  while length(index)>0      cn=ceil((length(index)-1e-6)*rand);%随机选择一个未被标记的点,作为圆心,进行均值漂移迭代      center=data(index(cn),:);      this_class=zeros(m,1);%统计漂移过程中,每个点的访问频率      %步骤2、3、4、5      while 1          %计算球半径内的点集          dis=sum((repmat(center,m,1)-data).^2,2);          radius2=radius*radius;          innerS=find(dis<radius*radius);          visitflag(innerS)=1;%在均值漂移过程中,记录已经被访问过得点         this_class(innerS)=this_class(innerS)+1;         newcenter=zeros(1,3);        sumweight=0;          for i=1:length(innerS)              w=exp(dis(innerS(i))/(radius*radius));              sumweight=w+sumweight;              newcenter=newcenter+w*data(innerS(i),:);         end          newcenter=newcenter./sumweight;          if norm(newcenter-center) <stopthresh %计算漂移距离,如果漂移距离小于阈值,那么停止漂移              break;          end          center=newcenter;    end       %步骤6 判断是否需要合并,如果不需要则增加聚类个数1个      mergewith=0;      for i=1:clustern          betw=norm(center-clustercenter(i,:));          if betw<radius/2              mergewith=i;               break;          end      end      if mergewith==0           %不需要合并          clustern=clustern+1;          clustercenter(clustern,:)=center;          count(:,clustern)=this_class;      else                      %合并          clustercenter(mergewith,:)=0.5*(clustercenter(mergewith,:)+center);          count(:,mergewith)=count(:,mergewith)+this_class;        end      %重新统计未被访问过的点      index=find(visitflag==0);  end%结束所有数据点访问 %绘制分类结果,仅只画出前4个类簇,可根据自己需要作调整画图。for i=1:m      [value index]=max(count(i,:));      Idx(i)=index;  end  figure(2);  plot3(A(:,1),A(:,2),A(:,3),'g.');hold on;  for i=1:m      if Idx(i)==1;          plot3(data(i,1),data(i,2),data(i,3),'o','MarkerEdgeColor','k','MarkerFaceColor','y', 'MarkerSize',5);    elseif Idx(i)==2;          plot3(data(i,1),data(i,2),data(i,3),'o','MarkerEdgeColor','k','MarkerFaceColor','b', 'MarkerSize',5);    elseif Idx(i)==3;           plot3(data(i,1),data(i,2),data(i,3),'o','MarkerEdgeColor','k','MarkerFaceColor','r', 'MarkerSize',5);    elseif Idx(i)==4;           plot3(data(i,1),data(i,2),data(i,3),'o','MarkerEdgeColor','k','MarkerFaceColor','w', 'MarkerSize',5);% elseif Idx(i)==5;%      plot3(data(i,1),data(i,2),data(i,3),'o','MarkerEdgeColor','k','MarkerFaceColor','w', 'MarkerSize',5);%         '%         '%         '    end  end  for k = 1:clustern    CC(k,:)=[clustercenter(k,1),clustercenter(k,2),clustercenter(k,3)];end  OX=[50,0,0]';OY=[0,50,0]';OZ=[0,0,50]';xlabel('X轴');ylabel('Y轴');zlabel('Z轴');axis equal;rotate3d on;quiver3(0,0,0,OX(1),OX(2),OX(3),'color',[1 0 0 ],'LineWidth',2);quiver3(0,0,0,OY(1),OY(2),OY(3),'color',[0 1 0 ],'LineWidth',2);quiver3(0,0,0,OZ(1),OZ(2),OZ(3),'color',[0 0 1 ],'LineWidth',2);hold offtitle('Mean shift对边界点聚类');

⛄ 运行结果

⛄ 参考文献

[1] 张良, 周佳雯, 张谦,等. 基于改进MeanShift的Lidar点云数据道路标识线提取方法及系统:, CN108171131A[P]. 2018.

[2] 石少青张乐平张本松吴昊文连新凯杜书帅. 基于Meanshift聚类和孪生网络的非侵入式负荷辨识方法[J]. 电气传动, 2022, 52(24):67-74.

[3] 孙正林, 邹峥嵘, 吴爱琴. 一种改进的MeanShift点云数据滤波[J]. 测绘工程, 2011, 20(5):3.

⛳️ 代码获取关注我

❤️部分理论引用网络文献,若有侵权联系博主删除
❤️ 关注我领取海量matlab电子书和数学建模资料


相关文章
|
2月前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。
|
3月前
|
算法 数据挖掘
基于粒子群优化算法的图象聚类识别matlab仿真
该程序基于粒子群优化(PSO)算法实现图像聚类识别,能识别0~9的数字图片。在MATLAB2017B环境下运行,通过特征提取、PSO优化找到最佳聚类中心,提高识别准确性。PSO模拟鸟群捕食行为,通过粒子间的协作优化搜索过程。程序包括图片读取、特征提取、聚类分析及结果展示等步骤,实现了高效的图像识别。
|
5月前
|
安全
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
本文介绍了2023年高教社杯数学建模竞赛D题的圈养湖羊空间利用率问题,包括问题分析、数学模型建立和MATLAB代码实现,旨在优化养殖场的生产计划和空间利用效率。
246 6
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
|
5月前
|
存储 算法 搜索推荐
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
本文提供了2022年华为杯数学建模竞赛B题的详细方案和MATLAB代码实现,包括方形件组批优化问题和排样优化问题,以及相关数学模型的建立和求解方法。
146 3
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
|
5月前
|
数据采集 存储 移动开发
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码
本文介绍了2023年五一杯数学建模竞赛B题的解题方法,详细阐述了如何通过数学建模和MATLAB编程来分析快递需求、预测运输数量、优化运输成本,并估计固定和非固定需求,提供了完整的建模方案和代码实现。
115 0
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码
|
6月前
|
机器学习/深度学习 算法 数据挖掘
基于改进K-means的网络数据聚类算法matlab仿真
**摘要:** K-means聚类算法分析,利用MATLAB2022a进行实现。算法基于最小化误差平方和,优点在于简单快速,适合大数据集,但易受初始值影响。文中探讨了该依赖性并通过实验展示了随机初始值对结果的敏感性。针对传统算法的局限,提出改进版解决孤点影响和K值选择问题。代码中遍历不同K值,计算距离代价,寻找最优聚类数。最终应用改进后的K-means进行聚类分析。
100 10
|
8月前
|
数据安全/隐私保护
耐震时程曲线,matlab代码,自定义反应谱与地震波,优化源代码,地震波耐震时程曲线
地震波格式转换、时程转换、峰值调整、规范反应谱、计算反应谱、计算持时、生成人工波、时频域转换、数据滤波、基线校正、Arias截波、傅里叶变换、耐震时程曲线、脉冲波合成与提取、三联反应谱、地震动参数、延性反应谱、地震波缩尺、功率谱密度
基于混合整数规划的微网储能电池容量规划(matlab代码)
基于混合整数规划的微网储能电池容量规划(matlab代码)
|
8月前
|
数据安全/隐私保护
地震波功率谱密度函数、功率谱密度曲线,反应谱转功率谱,matlab代码
地震波格式转换、时程转换、峰值调整、规范反应谱、计算反应谱、计算持时、生成人工波、时频域转换、数据滤波、基线校正、Arias截波、傅里叶变换、耐震时程曲线、脉冲波合成与提取、三联反应谱、地震动参数、延性反应谱、地震波缩尺、功率谱密度
|
8月前
|
算法 调度
含多微网租赁共享储能的配电网博弈优化调度(含matlab代码)
含多微网租赁共享储能的配电网博弈优化调度(含matlab代码)

热门文章

最新文章