二维点云拉普拉斯深度平滑算法-matlab
克服普通平滑会破坏括扑关系的问题,引入权值,更加可靠
输入:data:数据集
kkk:邻域搜索范围,视情况定
M:迭代次数,越高,平滑越夸张
function [data]=Laplacian_deep_Smooth(data,kkk,M)
for i=1:M
%%%%%%%%%%%%%%%%%%%%%%%%%补充起末点,防止边缘平滑收缩、翘起
sector=floor(kkk/2);
data_first=2*data(1,:)-data(1:sector,:);
data_end=2*data(end,:)-data(end-sector+1:end,:);
data2=[data_first;data;data_end];
%%%%%%%%%%%%%%%%%%%%%%%%%
N = length(data2);
n = zeros(N,2);
[IDX,~] = knnsearch(data2,data2,'k',kkk);
for i=1:N
% 当前点邻域点集的索引
IndexOfCurrentNeibors = IDX(i,:);
% 当前点邻域点集
CurrentNeighbors = data2(IndexOfCurrentNeibors,:);
PtCent = mean(CurrentNeighbors); %得到局部点云平均值,便于计算法向量长度和方向
% PCA法计算法向量
B = CurrentNeighbors - repmat(PtCent,kkk,1); % 去中心化点集矩阵
PtCov = transpose(B)*B; %协方差矩阵
% 求特征值、特征向量。
% D是对应的特征值对角矩阵,V是特征向量
% (因为协方差矩阵为实对称矩阵,故特征向量为单位正交向量)
[V,D] = eig(PtCov);
% d0为最小特征值 idx为特征值的列数索引。
[~, idx] = min(diag(D)); % diag():创建对角矩阵或获取矩阵的对角元素
n(i,:) = V(:,idx)'; % 最小特征值对应的特征向量为法矢,即单位法向量
% 朝向统一
n1 = [0,1]; %% n1用的是y轴正方向
n2 = n(i,:); %% n2用的是n的i个方向
if dot(n1,n2)<0 % 如果这个向量与法向量的数量积为负数(反向)
n(i,:) = -n(i,:); % 法向量取反向
end
end
%法向量可视化
% quiver(data2(:,1),data2(:,2),n(:,1),n(:,2),0.2);
% hold on
%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:length(data2)
%%%%%%%%%%%%%%%平衡法线
Index_F = IDX(i,:);% 当前点邻域点集的索引
F = n(Index_F,:);% 当前点邻域点集
mF=mean(F);
MF(i,:)=mF;
%%%%%%%%%%%%%%
o=atan(mF(1,2)/mF(1,1));
Index_z = IDX(i,2:end);
z=data2(Index_z,:);
u=z-data2(IDX(i,1),:);
v(:,[1,2])=u.*mF;
v(:,3)=((z(:,1)-data2(IDX(i,1),1)).^(2)+(z(:,2)-data2(IDX(i,1),2)).^(2)).^(0.5);
v=sortrows(v,3,'descend');
NN=length(v);
NH=1/sum(1:NN);
for k=1:length(v)
cv(k,1)=NH*k;
end
cb=(v(:,1)+v(:,2)).*cv;
QE=sum(cb);
%%%%%%%%%%%%%%
x=cos(o)*QE;
y=sin(o)*QE;
if o<0
y=-y;
x=-x;
end
data3(i,:)=data2(i,:)+[x,y];
end
data3=data3(sector+1:length(data3)-sector,:);
% quiver(data2(:,1),data2(:,2),MF(:,1),MF(:,2),0.2);
% hold on
data=data3;
end
end
二维点云拉普拉斯深度平滑算法-matlab相关推荐
- 二维光子晶体禁带的遗传优化算法实现
二维光子晶体禁带的遗传优化算法MATLAB源代码 光子晶体中因周期性结构而存在的频率禁带称为光子禁带,光子禁带的存在是光子晶体具有广泛应用前景的重要原因. 禁带越大,可控光的频带也越宽,因此如何设计合 ...
- 二维点云ICP原理推导
二维点云ICP原理推导 描述 ICP是迭代就近点算法,大部分的实现代码都是基于PCL点云库的,也就是三维点云的匹配 实际上,二维点云数据也算是常见的数据类型,比如移动机器人经常使用的单线雷达.本文就是 ...
- cartographer二维点云地图
文章目录 前言 一.修改思路 还是TrajectoryNode 二.计算步骤 1.gravity_alignment 坐标系到local坐标系 2.local坐标系到global坐标系 三.具体替换代 ...
- 基于二维切片图序列的三维立体建模MATLAB仿真
目录 1.算法概述 2.仿真效果预览 3.核心MATLAB程序 4.完整MATLAB程序 1.算法概述 isosurface 等值面函数 调用格式: fv = isosurface(X,Y,Z,V,i ...
- 【二维码识别】基于matlab GUI灰度+二值化+校正二维码生成与识别【含Matlab源码 635期】
⛄一.二维码生成与识别简介 如今,移动互联网技术日新月异,随着5G时代的来临,广泛应用于数据处理过程中的二维码信息安全日益成为人们越来越关注的问题.以QR码为代表的二维码,以其在信息存储.传输和识别技 ...
- 看懂二维码识别OCR:从算法到API 接入代码
引言 二维码识别OCR(Optical Character Recognition)是结合了图像处理和OCR技术,以识别和提取二维码中的信息的技术,二维码识别OCR 可以实现对图像中的二维码进行自动检 ...
- 基于Excel的QR二维码生成工具——原理及算法详解(之一)
老虎二维码(下载链接在这里)是一个基于Excel的二维码生成工具,完全使用Excel表单公式结合VBA实现,没有调用任何外部库,实现了支持中文英文混合字符以及常用微信二维码编码的自动生成,在工作表单元 ...
- 数组(一维数组、多维数组/二维数组)和简单排序算法
提示:数组是线性数据结构中最为基础,最为典型的一种顺序型结构. 它用一组连续的内存空间 ,来存储一组具有相同类型的数据. 与变量相比,变量是一种单一的数据存储方式,而数组是用于存储一连串的一组数据. ...
- 矩阵(二维数组)的性质在算法求解中的应用
本文所说的矩阵(matrix),其实在编程实现时,往往以二维数组的形式出现. 1. 对称矩阵(二维数组) 在求解旅行商问题时,题干中要求,城市之间彼此互通(两城市之间的道路只有一条). double ...
最新文章
- Object Builder Application Block (2)
- IDFA的值什么时候会发生改变
- 2006年4月计算机等级考试二级Java笔试答案
- Android中文API(122) —— AudioRecord
- Linux系统启动流程图
- 黑马博客——详细步骤(六)项目功能的实现之用户信息删除
- stm32 非debug模式程序无法运行
- 怎样查看域名DNS服务器的相一些关信息
- PCB Layout的设计要点
- (Tekla Structures二次开发)将报表模板数据写入文本文件
- C语言的s8数据结构
- ARPU与客单价区别
- 什么是位移电流?位移电流密度计算公式详解
- WORD如何取消默认的分栏
- 基于Php美妆化妆品商城购物网站
- 用代码过中秋,python海龟月饼你要不要尝一口?
- Ubuntu安装后,无启动项,解决办法
- 我的世界java18w50a_我的世界Minecraft Java版 18w21a 发布
- python标准库math中用来计算平方根的函数是_2020超星尔雅网课透过性别看世界完整满分见面课答案...
- Lesson 2 Thirteen equals one 十三等于一