✅作者简介:热爱科研的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)>0cn=ceil((length(index)-1e-6)*rand);%随机选择一个未被标记的点,作为圆心,进行均值漂移迭代center=data(index(cn),:);this_class=zeros(m,1);%统计漂移过程中,每个点的访问频率%步骤2、3、4、5while 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),:);endnewcenter=newcenter./sumweight;if norm(newcenter-center) <stopthresh %计算漂移距离,如果漂移距离小于阈值,那么停止漂移break;endcenter=newcenter;end%步骤6 判断是否需要合并,如果不需要则增加聚类个数1个mergewith=0;for i=1:clusternbetw=norm(center-clustercenter(i,:));if betw<radius/2mergewith=i;break;endendif 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;endfigure(2);plot3(A(:,1),A(:,2),A(:,3),'g.');hold on;for i=1:mif 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);% '% '% 'endendfor k = 1:clusternCC(k,:)=[clustercenter(k,1),clustercenter(k,2),clustercenter(k,3)];endOX=[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电子书和数学建模资料
文章介绍了MeanShift算法的基本原理,它是一种用于聚类和寻找数据集中密度最大区域的方法。在Matlab中,通过迭代计算点的平均偏移量来实现数据点的聚类。代码示例展示了如何对点云数据进行聚类,并提供了MeanShift算法的实现细节,包括搜索半径和停止条件的设定。此外,文章还提及了算法在视觉领域,特别是深度学习后处理中的应用。
1万+

被折叠的 条评论
为什么被折叠?



