matlab封闭曲线拟合 (针对一些列离散点)
matlab封闭曲线拟合 (针对一些列离散点)
matlabaihaozhe
学matlab编程就关注matlab爱好者!
很久之前给大家介绍了如何用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 中下载,或在matlab爱好者公众号中回复 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.
如需转载,请在公众号中回复“ 转载 ”获取授权!
-
2023年血糖新标准公布,不是3.9-6.1,快来看看你的血糖正常吗? 2023-02-07
-
2023年各省最新电价一览!8省中午执行谷段电价! 2023-01-03
-
GB 55009-2021《燃气工程项目规范》(含条文说明),2022年1月1日起实施 2021-11-07
-
PPT导出高分辨率图片的四种方法 2022-09-22
-
2023年最新!国家电网27家省级电力公司负责人大盘点 2023-03-14
-
全国消防救援总队主官及简历(2023.2) 2023-02-10
-
盘点 l 中国石油大庆油田现任领导班子 2023-02-28
-
我们的前辈!历届全国工程勘察设计大师完整名单! 2022-11-18
-
关于某送变电公司“4·22”人身死亡事故的快报 2022-04-26
