最近在做一个闭合曲线拟合的问题,手头有一些二维离散点的数据,大概长这样:

我想要把这样不完全闭合的曲线给补齐成闭合的曲线,脑补一下:

研究了半天,发现MATLAB的拟合工具箱虽然强大,但是只能拟合常规的函数曲线。无奈,只能转向求助于python。

首先第一步,发挥下MATLAB的余热,把离散点的x和y坐标保存至mat文件:

pts = [x y]; save('pts.mat', 'pts')

下一步,打开Anaconda中的spyder,输入下列代码:

import osimport scipy.io as sioimport numpy as npfrom scipy.interpolate import splprep, splev filePath = r"yourPath"dirs = os.listdir(filePath) nPoint = 1000pts = sio.loadmat(filePath \      + '\\pts.mat')['pts'] tck, u = splprep(pts.T, \      u=None, s=5, per=1, k = 3) u_new = np.linspace( \      u.min(), u.max(), nPoint) x_new, y_new = splev( \      u_new, tck, der=0) pts_repaired = np.transpose( \      np.vstack((x_new, y_new))) sio.savemat(filePath + \      '\\pts_repaired.mat', \      {'pts_repaired': pts_repaired})最后再把python生成的mat文件用MATLAB读取并画个图看看效果:

load('pts_repaired.mat')figure hold on plot(pts_repaired(:,1), ...     pts_repaired(:,2), ...    'lineWidth', 2, ...    'color', 'b') plot(pts(:,1), pts(:,2), ...    'lineStyle', 'none', ...    'color', 'r', ...    'marker', '+') box on

目前为止我没有找到MATLAB拟合闭合曲线的方法,直角坐标系转极坐标的方法我试了貌似不行,如果有大牛搞定了还麻烦不吝赐教;

Python的SciPy库中样条函数插值是支持闭合曲线的,但是所输入的x和y离散点坐标序列必须连续,也就是逐个相连可以画出图形的轮廓,不可以乱序。至于如何将乱序点排列成clockwise或者anti-clockwise顺序,MATLAB自带的boundary()函数了解一下。

P.S. 最近不知为毛涨了一些粉,容我窃喜一下~