資源簡介
針對點云數(shù)據(jù)進行Mean shift聚類,可以通過調(diào)整聚類算法的閾值以及搜索半徑,來達到不同的聚類效果,內(nèi)附有示例,運行test.m即可。
代碼片段和文件信息
function?[CC]=Mean_shift_7171(cA)
data=c;
%mean?shift?算法??
[mn]=size(data);??
index=1:m;??
radius=10;?????????????????????????%搜索半徑設(shè)定
stopthresh=1e-3*radius;????%閾值設(shè)定
visitflag=zeros(m1);%標記是否被訪問??
count=[];??
clustern=0;??
clustercenter=[];??
while?length(index)>0??
????cn=ceil((length(index)-1e-6)*rand);%隨機選擇一個未被標記的點,作為圓心,進行均值漂移迭代??
????center=data(index(cn):);??
????this_class=zeros(m1);%統(tǒng)計漂移過程中,每個點的訪問頻率??
????%步驟2、3、4、5??
????while?1??
????????%計算球半徑內(nèi)的點集??
????????dis=sum((repmat(centerm1)-data).^22);??
????????radius2=radius*radius;??
????????innerS=find(dis ????????visitflag(innerS)=1;%在均值漂移過程中,記錄已經(jīng)被訪問過得點?
????????this_class(innerS)=this_class(innerS)+1;?
????????newcenter=zeros(13);
????????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)? ????????????break;??
????????end??
????????center=newcenter;
????end??
?????%步驟6?判斷是否需要合并,如果不需要則增加聚類個數(shù)1個??
????mergewith=0;??
????for?i=1:clustern??
????????betw=norm(center-clustercenter(i:));??
????????if?betw ????????????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??
????%重新統(tǒng)計未被訪問過的點??
????index=find(visitflag==0);??
end%結(jié)束所有數(shù)據(jù)點訪問?
%繪制分類結(jié)果,僅只畫出前4個類簇,可根據(jù)自己需要作調(diào)整畫圖。
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(i1)data(i2)data(i3)‘o‘‘MarkerEdgeColor‘‘k‘‘MarkerFaceColor‘‘y‘?‘MarkerSize‘5);
????elseif?Idx(i)==2;??
????????plot3(data(i1)data(i2)data(i3)‘o‘‘MarkerEdgeColor‘‘k‘‘MarkerFaceColor‘‘b‘?‘MarkerSize‘5);
????elseif?Idx(i)==3;??
?????????plot3(data(i1)data(i2)data(i3)‘o‘‘MarkerEdgeColor‘‘k‘‘MarkerFaceColor‘‘r‘?‘MarkerSize‘5);
????elseif?Idx(i)==4;??
?????????plot3(data(i1)data(i2)data(i3)‘o‘‘MarkerEdgeColor‘‘k‘‘MarkerFaceColor‘‘w‘?‘MarkerSize‘5);
%?elseif?Idx(i)==5;
%??????plot3(data(i1)data(i2)data(i3)‘o‘‘MarkerEdgeColor‘‘k‘‘MarkerFaceColor‘‘w‘?‘MarkerSize‘5);
%?????????‘
%?????????‘
%?????????‘
????end??
end??
for?k?=?1:clustern
????CC(k:)=[clustercenter(k1)clustercenter(k2)clustercenter(k3)];
end??
OX=[5000]‘;
OY=[0500]‘;
OZ=[0050]‘;
xlabel(‘X軸‘);
ylabel(‘Y軸‘);
zlabel(‘Z軸‘);
axis?equal;rotate3d?on;
quiver3(000OX(1)OX(2)OX(3)‘color‘[1?0?0
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????76125??2020-05-18?13:56??Mean?shift對點云聚類\A.mat
?????文件???????3397??2020-05-18?13:58??Mean?shift對點云聚類\Mean_shift_7171.m
?????文件??????11483??2020-05-18?13:57??Mean?shift對點云聚類\POINT.mat
?????文件????????587??2020-05-18?13:52??Mean?shift對點云聚類\test.m
?????目錄??????????0??2020-05-18?13:53??Mean?shift對點云聚類
-----------?---------??----------?-----??----
????????????????91592????????????????????5
評論
共有 條評論