当前位置:网站首页>matlab封闭曲线拟合 (针对一些列离散点)
matlab封闭曲线拟合 (针对一些列离散点)
2022-08-04 05:35:00 【懂科研的程序员】
很久之前给大家介绍了如何用matlab进行图像轮廓坐标提取 (直通车:matlab任意图形轮廓坐标提取【含源代码】),当时就立了个flag要给大家做一期有关如何用matlab进行封闭曲线拟合的博文,拖了这么,它终于与大家见面了。
封闭曲线拟合和普通曲线拟合相比有个最大特点就是封闭曲线首尾相接,且多处出现一对多的情况,很难用一个解析式来表达 (当然像圆、椭圆这类规则的封闭曲线除外)。通过检索资料发现,D. A. Smith指出使用样条拟合的方式可以实现封闭曲线的拟合,顾天奇等人指出采用移动最小二乘法的方式可以实现封闭曲线拟合 (咱已经用matlab实现了此方法)。通过在File Exchange中检索发现,Santiago Benito通过调用matlab内置拟合函数的方式实现了封闭曲线的拟合,并将整合后的函数命名为:interpclosed。
本文主要介绍Santiago Benito所写函数能实现的功能以及相关的调用方法,咱自己写的代码暂不与大家分享。
The function can be used to:
(i) return the fit itself;
(ii) interpolate values within the curve using an arc-length parametrization;
(iii) compute the area, perimeter, centroid, and second moments of area of the curve.
Santiago Benito (File Exchange)
调用方式很简单,只需要准备按次序排列的XY坐标点 (随机打乱的数据点不能用,需要事先调整好各个点次序),然后指定一种拟合方法即可 (支持:'linear' 'pchip' 'spline'),咱对该代码进行升级修改,增加了cscvn、makima两种方法(升级后的代码将分享至原创代码与科研论文交流群中供公众号铁杆粉丝下载使用)。以下是使用interpclosed的应用案例,拟合所用到的数据来源于stackoverflow。
先上效果图

相关代码
% 数据来源:https://stackoverflow.com/questions/31464345/fitting-a-closed-curve-to-a-set-of-points
% interpclosed函数:nl.mathworks.com/matlabcentral/fileexchange/69055-interpclosed
clc;clear;close all;
data = [6.55525,3.05472;6.17284,2.802609;5.53946,2.649209;4.93053,2.444444;4.32544,2.318749;3.90982,2.2875;...
3.51294,2.221875;3.09107,2.29375;2.64013,2.4375;2.275444,2.653124;2.137945,3.26562;2.15982,3.84375;...
2.20982,4.31562;2.334704,4.87873;2.314264,5.5047;2.311709,5.9135;2.29638,6.42961;2.619374,6.75021;...
3.32448,6.66353;3.31582,5.68866;3.35159,5.17255;3.48482,4.73125;3.70669,4.51875;4.23639,4.58968;...
4.39592,4.94615;4.33527,5.33862;3.95968,5.61967;3.56366,5.73976;3.78818,6.55292;4.27712,6.8283;...
4.89532,6.78615;5.35334,6.72433;5.71583,6.54449;6.13452,6.46019;6.54478,6.26068;6.7873,5.74615;...
6.64086,5.25269;6.45649,4.86206;6.41586,4.46519;5.44711,4.26519;5.04087,4.10581;4.70013,3.67405;...
4.83482,3.4375;5.34086,3.43394;5.76392,3.55156;6.37056,3.8778;6.53116,3.47228;6.55525,3.05472];
r0 = mean(data);
x = data(:,1);
y = data(:,2);
n = 200;
tq = 0:1/n:1;
xyqS = interpclosed(x,y,tq);
xyqL = interpclosed(x,y,tq,'linear');
xyqP = interpclosed(x,y,tq,'cscvn');
plot(x,y,'.',xyqS(1,:),xyqS(2,:),xyqL(1,:),xyqL(2,:),xyqP(1,:),xyqP(2,:),'linewidth',2.5,'MarkerSize',30);
hold on;
plot(r0(1),r0(2),'r.','markersize',35);
axis equal;axis([2 7 2 7]);
hold off;未升级版interpclosed函数的获取方式,点击左下角阅读原文直接转到File Exchange中下载,或在懂科学的程序员公众号中回复QQ加交流群获取。想要获取升级版以及更多咱原创或升级优化代码的伙伴可在公众号中回复“原创”加群获取。
参考资料:
[1] stackoverflow.com/questions/31464345/fitting-a-closed-curve-to-a-set-of-points.
[2] nl.mathworks.com/matlabcentral/fileexchange/69055-interpclosed.
[3] D. A. Smith,Computers in Physics 6, 472 (1992); doi: 10.1063/1.168433.
[4] 顾天奇 等,封闭离散点的曲线拟合方法 [J], 吉林大学学报(工学版), 45 (2), 2015.
如需转载,请在懂科学的程序员公众号中回复“转载”获取授权!
边栏推荐
猜你喜欢

Time Series Forecasting Based on Reptile Search RSA Optimized LSTM

Microsoft computer butler 2.0 beta experience

sql常用函数

HbuilderX 启动微信小程序 无法打开项目

如何在Excel 里倒序排列表格数据 || csv表格倒序排列数据

RuntimeError: You called this URL via POST, but the URL doesn‘t end in a slash and you have APPEND_S

unicloud 腾讯云 上传文件 Have no access right to the storage uniapp

U-Net详解:为什么它适合做医学图像分割?(基于tf-Kersa复现代码)

Database: Organize Four Practical SQL Server Scripting Functions

狗都能看懂的Pytorch MAML代码详解
随机推荐
Faster - RCNN principle and repetition code
Time Series Forecasting Based on Reptile Search RSA Optimized LSTM
RuntimeError: You called this URL via POST, but the URL doesn‘t end in a slash and you have APPEND_S
树莓派 4 B 拨动开关控制风扇 Rasberry Pi 4 B Add Toggle Switch for the Fan
让src文件夹能读取xml文件
更改软件的默认安装位置
IoU, GIoU, DIoU and CIoU in target detection
Unable to preventDefault inside passive event listener due to target being treated as passive. See
类图规范总结
硬件知识:RTMP和RTSP传统流媒体协议介绍
【C# - 爬虫】使用Selenium实现爬虫,获取近七天天气信息(包含完整代码)
DOM的12中节点类型,通过关系或方法获取DOM节点,渲染到浏览器页面的一些特效功能,获取DOM节点来改变属性,点击图片,切换为所点击的图片为背景图,页面上的表单验证,点击底部导航栏切换界面
华硕飞行堡垒系列无线网经常显示“无法连接网络” || 一打开游戏就断网
如何在网页标题栏中加入图片!
Microsoft Store 微软应用商店无法连接网络,错误代码:0x80131500
更改mysql数据库默认的字符集(mysql 存储 emoji表情)
Uos统信系统 IP地址以及完整主机名配置
为什么不使用VS管理QT项目
数据库sql的基础语句
异步编程之promise,任务队列,事件循环