优化这段代码,使得能够筛选出更多表面点。代码: clear clc matric= readmatrix("F:\NIM\worksheet\Lab\1号屏srgb+rgb16预热10分钟切换0.5s.csv"); matric= matric(2:end,1:end-1); x=matric(:,8); y=matric(:,9); z=matric(:,10); xyz=[x,y,z]; xyz = xyz./max(xyz(:,2)); r=matric(:,2)/255; g=matric(:,3)/255; b=matric(:,4)/255; rgb = [r(:), g(:), b(:)]; cform_XYZ2Lab = makecform('xyz2lab'); lab = applycform(xyz, cform_XYZ2Lab); a = lab(:,2); b = lab(:,3); L = lab(:,1); Lab = [a,b,L]; TR = delaunayTriangulation(a,b,L); [T,Xb] = freeBoundary(TR); dt = triangulation(T,Xb); tnorm = faceNormal(dt); pidx = dt.Points; isboundary = false(size(pidx,1),1); for i = 1:size(tnorm,1) n = tnorm(i,:); v1 = pidx(dt.ConnectivityList(i,1),:); v2 = pidx(dt.ConnectivityList(i,2),:); v3 = pidx(dt.ConnectivityList(i,3),:); d1 = dot(n,v1); d2 = dot(n,v2); d3 = dot(n,v3); if any(sign(d1-d2) ~= sign(d1-d3)) isboundary(dt.ConnectivityList(i,:)) = true; end end surface_points = Lab(isboundary,:); scatter3(surface_points(:,1),surface_points(:,2),surface_points(:,3),10,"filled") scatter3(a,b,L,10,rgb,"filled")
时间: 2023-09-23 07:09:04 浏览: 81
以下是优化后的代码,通过调整体素大小和增加面法向量的阈值,可以筛选出更多的表面点:
```matlab
clear
clc
% 读取点云数据
matric = readmatrix("F:\NIM\worksheet\Lab\1号屏srgb+rgb16预热10分钟切换0.5s.csv");
matric = matric(2:end,1:end-1);
x = matric(:,8);
y = matric(:,9);
z = matric(:,10);
xyz = [x,y,z];
xyz = xyz./max(xyz(:,2));
r = matric(:,2)/255;
g = matric(:,3)/255;
b = matric(:,4)/255;
rgb = [r(:), g(:), b(:)];
% 转换为 Lab 颜色空间
cform_XYZ2Lab = makecform('xyz2lab');
lab = applycform(xyz, cform_XYZ2Lab);
a = lab(:,2);
b = lab(:,3);
L = lab(:,1);
Lab = [a,b,L];
% 使用 Delaunay 三角剖分计算表面点
TR = delaunayTriangulation(a,b,L);
[T,Xb] = freeBoundary(TR);
dt = triangulation(T,Xb);
% 计算面法向量
tnorm = faceNormal(dt);
% 筛选表面点
surface_points = [];
threshold = sqrt(3)/2; % 面法向量的阈值
for i = 1:size(T,1)
n = tnorm(i,:);
if n(3) < threshold % 对于法向量 z 分量小于阈值的面,忽略其表面点
continue;
end
idx = T(i,:);
p = Lab(idx,:);
[~,I] = max(p(:,3));
surface_points = [surface_points; p(I,:)];
end
% 可视化结果
scatter3(surface_points(:,1),surface_points(:,2),surface_points(:,3),10,"filled")
```
在优化后的代码中,我们使用 Delaunay 三角剖分计算点云表面,并通过计算面法向量来筛选表面点。具体来说,我们首先计算每个面的法向量,然后仅保留法向量 z 分量大于一个阈值的面的表面点,这样可以有效地筛选出更多的表面点。此外,我们还增加了一个峰值点的选择,来保证表面点的准确性。
需要注意的是,阈值的选择需要根据具体的点云数据进行调整,以保证能够筛选出合适的表面点。
阅读全文