clc;
clear;
data=load('E:\03_学生科研训练与毕设\拷贝\trees.xyz');
x=data(:,1);
y=data(:,2);
z=data(:,3);
figure;
plot3(x,y,z,'.');
hold on;
xmin=min(x);
xmax=max(x);
ymin=min(y);
ymax=max(y);
len=0.3;
%将方格向外进行扩展一圈
newxmin=(fix(xmin/len)-2)*len;%扩展30个方格
newymin=(fix(ymin/len)-2)*len;%扩展30个方格
newxmax=(fix(xmax/len)+2)*len;%扩展30个方格
newymax=(fix(ymax/len)+2)*len;%扩展30个方格
hang=fix((newymax-newymin)/len)+1;
lie=fix((newxmax-newxmin)/len)+1;
%创建元胞数组,初始化全部为[]
%A=[x,y]
A={};
for i=1:hang
for j=1:lie
A{i,j}=[];
end
end
%将点云数据划入到相应的栅格中
[m,n]=size(data);
for i=1:m
k=fix((y(i)-newymin)/len)+1;%行号
j=fix((x(i)-newxmin)/len)+1;%列号
A{k,j}=[A{k,j};x(i),y(i),z(i)];%将属于同一个方格内的点放在一个矩阵
end
I=[];%定义一个二值图像矩阵
for i=1:hang
for j=1:lie
if(isempty(A{i,j})==1) %空格的情况
I(i,j)=0;%有点的用白色表示
else
I(i,j)=1;%无点的用黑色表示
end
end
end
%I=flipdim(I,1);%原图像的水平镜像
figure;
imshow(I);
hold on;
[L,num] = bwlabel(I,8);%8 表示8连通 4表示4连通
%结果可视化
RGB=label2rgb(L);
figure;
imshow(RGB);
hold on;
result={};
for i=1:num
result{1,i}=[];
end
%属于同一簇的点放入到同一矩阵中
[m,n]=size(L);%m行 n列
for i=1:m
for j=1:n
my_id=L(i,j);
if (my_id ~= 0)
result{1,my_id}=[result{1,my_id};A{i,j}];
end
end
end
figure;
for i=1:num
arr=result{1,i};
if(i==1)
plot3(arr(:,1),arr(:,2),arr(:,3),'.b');
hold on;
elseif(i==2)
plot3(arr(:,1),arr(:,2),arr(:,3),'.m');
hold on;
else
plot(arr(:,1),arr(:,2),arr(:,3),'.r');
hold on;
end
end