使用k近邻滤波去除目标物体中的噪声点,代码中包含条件滤波,
clear
close all;
clc
P=load("G:\2021-6-28 17-14-32-Color.png.txt"); %载入反面点云数据
x=P(:,1);
y=P(:,2);
z=P(:,3);
R=P(:,4);
G=P(:,5);
B=P(:,6);
h1=[R,G,B];
% P1=P(:,1:3);
figure; %显示原始点云
scatter3(x,z,y,10,h1/255,'.');
axis([-0.5 0.5 0.2 1.2 -0.3 0.35]);
%筛选指定区域的点云
% ind=find((x<0.5)&(x>-0.5)&(y<0.2)&(y>-0.12)&(z<1)&(z>0));
ind=find((x<0.4)&(x>-0.4)&(y<0.2)&(y>-0.11)&(z<1.2)&(z>0.2));
A1=P(ind,:);%找到满足上述z范围点的整行数据
x1=A1(:,1);%显示新的x,y,z点及RGB值
y1=A1(:,2);
z1=A1(:,3);
R1=A1(:,4);
G1=A1(:,5);
B1=A1(:,6);
rgb1=[R1,G1,B1];
P1=A1(:,1:3);
% pointdata=importdata('C:\myfiles\xyz\mdq_face_1.xyz'); %载入点云数据
ptCloud = pointCloud(P1(:,:));
% figure;
% pcshow(ptCloud); %显示点云数据
[pointdata_rows,pointdata_list] = size(P1); %pointdata_rows行,后者是列
max_dists =0.01;
final_face = [];
for ii = 1:pointdata_rows %pointdata_rows
point = P1(ii,:);
k = 8;
[indices,dists] = findNearestNeighbors(ptCloud,point,k);%k是最近邻数量
mean_dists = mean(dists); %求均值
ss = std(dists,0,1); %求标准差
dt = mean_dists+(0.6*ss); %定义距离
indices_list = [];
if dt < max_dists
final_face = [final_face;point]; %final_face是大小是 2304*3,即x,y,z的值
end
end
figure;
x2=final_face(:,1);
y2=final_face(:,2);
z2=final_face(:,3);
%将对应点的RGB值存入final_face的4,5,6三列
[row,list] = size(final_face);
[row1,list1] = size(A1);
for j=1:row
for m=1:row1
if(final_face(j,1:3)==A1(m,1:3))
final_face(j,4)=A1(m,4);
final_face(j,5)=A1(m,5);
final_face(j,6)=A1(m,6);
end
end
end
R2=final_face(:,4);
G2=final_face(:,5);
B2=final_face(:,6);
rgb2=[R2,G2,B2];
% final_face(:,4)=A1(:,4);
% final_face(:,5)=A1(:,5);
% final_face(:,6)=A1(:,6);
scatter3(x2,z2,y2,10,rgb2/255,'.');
axis([-0.5 0.5 0.2 1.2 -0.3 0.35]); %显示降噪后的点云图
% pcshow(final_face); %显示降噪后的点云图
%后面的是把降噪后的点云重输出到文件
output_file = 'D:\1.txt';
fid = fopen(output_file,'w'); %‘a’打开或创建要写入的新文件。追加数据到文件末尾。w是覆盖原数据
[face_row_e,face_list_e] = size(final_face);
for i = 1:face_row_e
for j = 1:face_list_e
if(j>=4)
fprintf(fid,'%d\t',final_face(i,j)); %/t水平标签 %u无符号整数
end
if(j<=3)
fprintf(fid,'%f\t',final_face(i,j)); %/t水平标签
end
end
fprintf(fid,'\r\n'); %\n新队换行
end
fclose(fid);