matlab点云k近邻滤波

使用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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值