轨迹插值方法
参考文献:
[1]周鹏,陈金海,林乾锋,梅强,黄鹏飞.基于AIS的轨迹插值方法[J].集美大学学报(自然科学版),2018,23(06):443-447.
插值原理
以数值分析为基础, 常用的有拉格朗日线性插值、三次样条插值等
1. 拉格朗日插值方法
拉格朗日插值法能给出一个恰好穿过二维平面上若干个已知点的多项式函数。如对实际的轨迹数据进行处理, 有若干个已知点, 拉格朗日插值法可以得到一个多项式, 能够包含所有的已知点, 最后再由多项式得到插值点的数据。
这种方法思路简洁, 在算法的实现上也简单.
可能的缺点:
- 由于轨迹数据的离散性、连续变化的无规律性, 这种插值方法精度并不高;
- 数据量大, 根据拉格朗日插值方法构造插值多项式时, 插值点越多, 插值多项式的次数也越高, 当插值次数过高时就会出现龙格现象 (即在一定范围内能较好逼近, 但越接近插值端点, 误差也就越大的现象) , 这样得到的插值结果误差会很大, 还会产生虚假的波动, 不具备保形效果。
原理举例
已知有三个点,找到一根穿过它们的曲线
我们可以合理的假设,这根曲线是一个二次多项式:
第二根曲线f2(x),在x2点处,取值为1,其余两点取值为0:
第三根曲线f3(x),在x3点处,取值为1,其余两点取值为0:
这三根曲线就可以组成寻找的曲线
2. 三次样条插值方法
三次样条插值 (Spline插值) 是通过求解三弯矩方程组得出曲线函数组的过程, 最终得到的是通过一系列形值点的一条光滑曲线。
三次插值样条曲线在灵活性和计算速度之间进行了合理的折中。与更高次样条相比, 三次插值样条只需较少的计算和存储, 且较稳定。与二次插值样条相比, 三次插值样条在模拟任意形状时显得更灵活。
3.结合时间的插值方法
将运动分解为经度和纬度两种运动状态的变化, 即将原有的经纬度变化视为 (时间—经度) (时间—纬度) 两个一维运动的组合, 将两种方向上的运动都视为短时间的匀加速直线运动.
假设待插值点为
pi (Loni, Lati, vi, θi, ti)
其中:Lon代表经度;Lat代表纬度;v代表船速;θ代表航向;t代表发送时间。
前后两点坐标为
q1 (Lon1, Lat1, v1, θ1, t1)
q2 (Lon2, Lat2, v2, θ2, t2)
由通过经纬度插值变为通过时间插值, 通过插值时间序列T得到待插值时间ti点处的坐标 (Loni, Lati) ,再结合线性插值方法分别对两种运动状态插值, 最后将插值得到的相同时间的经纬度组合, 得到最终的插值结果。
上一篇: 数值方法 第 1 章.
下一篇: 面对面模拟牛顿法 (I) - 牛顿插值法
推荐阅读
-
数学建模算法与应用》 第 5 章 插值和拟合方法
-
拉格朗日插值法
-
Javascript 标准内置对象 布尔值_基础介绍_布尔值 构造函数_to-String 示例方法_valueOf 示例方法
-
[学习笔记] 利用多项式计算正弦和余弦近似值的快速方法。
-
使用C语言实现RGB图像缩放的双线性插值算法
-
14-傅里叶变换的代码实现-一、numpy实现傅里叶变换和逆傅里叶变换 1.numpy实现傅里叶变换numpy.fft.fft2实现傅里叶变换,返回一个复数数组(complex ndarray),也就是频谱图像numpy.fft.fftshift将零频率分量移到频谱中心(将左上角的低频区域,移到中心位置) 20*np.log(np.abs(fshift))设置频谱的范围。可以理解为,之前通过傅里叶变换得到复数的数组,是不能通过图像的方法展示出来的,需要转换为灰度图像(映射到[0,255]区间)需要注意的是1> 傅里叶得到低频、高频信息,针对低频、高频处理能够实现不同的目的2> 傅里叶过程是可逆的,图像经过傅里叶变换、逆傅里叶变换后,能够恢复到原始图像3> 在频域对图像进行处理,在频域的处理会反映在逆变换图像上 # 将绘制的图显示在窗口 %matplotlib qt5 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread(r"image\lena.bmp",cv2.IMREAD_GRAYSCALE) # 傅里叶变换 f = np.fft.fft2(img) # 移动中心位置 fshift = np.fft.fftshift(f) # 调整值范围 result = 20*np.log(np.abs(fshift)) plt.subplot(1,2,1) plt.imshow(img,cmap=plt.cm.gray) plt.title("original") plt.axis("off") plt.subplot(1,2,2) plt.imshow(result,cmap=plt.cm.gray) plt.title("result") plt.axis("off") plt.show 傅里叶变换的频谱图像: 2.numpy实现逆傅里叶变换numpy.fft.ifft2实现逆傅里叶变换,返回一个复数数组(complex ndarray)numpy.fft.ifftshiftfftshift函数的逆函数,将中心位置的低频,重新移到左上角iimg = np.abs(逆傅里叶变化结果)设置值的范围,映射到[0,255]区间 # 将绘制的图显示在窗口 %matplotlib qt5 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread(r"image\boat.bmp",cv2.IMREAD_GRAYSCALE) # 傅里叶变换 f = np.fft.fft2(img) fshift = np.fft.fftshift(f) # 逆傅里叶变换 ishift = np.fft.ifftshift(fshift) iimg = np.fft.ifft2(ishift) iimg = np.abs(iimg) plt.subplot(1,2,1) plt.imshow(img,cmap=plt.cm.gray) plt.title("original") plt.axis("off") plt.subplot(1,2,2) plt.imshow(iimg,cmap=plt.cm.gray) plt.title("iimg") plt.axis("off") plt.show 将一副图像,进行傅里叶变换和逆傅里叶变换后,进行对比(一样的) 实例:通过numpy实现高通滤波,保留图像的边缘信息 获取图像的形状rows,cols = img.shape获取图像的中心点crow,ccol = int(rows/2),int(cols/2)将频谱图像的中心区域(低频区域)设置为0(黑色)fshift[crow-30:crow+30,ccol-30:ccol+30] = 0 # 将绘制的图显示在窗口 %matplotlib qt5 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread(r"image\boat.bmp",cv2.IMREAD_GRAYSCALE) # 傅里叶变换 f = np.fft.fft2(img) fshift = np.fft.fftshift(f) # 高通滤波 rows,cols = img.shape crow,ccol = int(rows/2),int(cols/2) fshift[crow-30:crow+30,ccol-30:ccol+30] = 0 # 逆傅里叶变换 ishift = np.fft.ifftshift(fshift) iimg = np.fft.ifft2(ishift) iimg = np.abs(iimg) plt.subplot(1,2,1) plt.imshow(img,cmap=plt.cm.gray) plt.title("original") plt.axis("off") plt.subplot(1,2,2) plt.imshow(iimg,cmap=plt.cm.gray) plt.title("iimg") plt.axis("off") plt.show 使用numpy实现高通滤波的实验结果: 二、opencv实现傅里叶变换和逆傅里叶变换 1.opencv实现傅里叶变换 返回结果 = cv2.dft(原始图像,转换标识)1> 返回结果:是双通道的,第一个通道是结果的实数部分,第二个通道是结果的虚数部分2> 原始图像:输入图像要首先转换成np.float32(img)格式3> 转换标识:flags = cv2.DFT_COMPLEX_OUTPUT,输出一个复数阵列numpy.fft.fftshift将零频率分量移到频谱中心(将左上角的低频区域,移到中心位置)调整频谱的范围,将上面频谱图像的复数数组,转换为可以显示的灰度图像(映射到[0,255]区间)返回值 = 20*np.log(cv2.magnitude(参数1,参数2))1> 参数1:浮点型X坐标值,也就是实部2> 参数2:浮点型Y坐标值,也就是虚部 # 将绘制的图显示在窗口 %matplotlib qt5 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread(r"image\lena.bmp",cv2.IMREAD_GRAYSCALE) # 傅里叶变换 dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT) # 移动中心位置 dftShift = np.fft.fftshift(dft) # 调整频谱的范围 result = 20*np.log(cv2.magnitude(dftShift[:,:,0],dftShift[:,:,1])) plt.subplot(1,2,1) plt.imshow(img,cmap=plt.cm.gray) plt.title("original") plt.axis("off") plt.subplot(1,2,2) plt.imshow(result,cmap=plt.cm.gray) plt.title("result") plt.axis("off") plt.show 傅里叶变换的频谱图像: 2.opencv实现逆傅里叶变换返回结果 = cv2.idft(原始数据)1> 返回结果:取决于原始数据的类型和大小2> 原始数据:实数或者复数均可numpy.fft.ifftshiftfftshift函数的逆函数,将中心位置的低频,重新移到左上角调整频谱的范围,映射到[0,255]区间返回值 = cv2.magnitude(参数1,参数2)1> 参数1:浮点型X坐标值,也就是实部2> 参数2:浮点型Y坐标值,也就是虚部 # 将绘制的图显示在窗口 %matplotlib qt5 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread(r"image\lena.bmp",cv2.IMREAD_GRAYSCALE) # 傅里叶变换 dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT) dftShift = np.fft.fftshift(dft) # 逆傅里叶变换 ishift = np.fft.ifftshift(dftShift) iimg = cv2.idft(ishift) iimg = cv2.magnitude(iimg[:,:,0],iimg[:,:,1]) plt.subplot(1,2,1) plt.imshow(img,cmap=plt.cm.gray) plt.title("original") plt.axis("off") plt.subplot(1,2,2) plt.imshow(iimg,cmap=plt.cm.gray) plt.title("inverse") plt.axis("off") plt.show 将一副图像,进行傅里叶变换和逆傅里叶变换后,进行对比(一样的) 实例:通过opencv实现低通滤波,模糊一副图像
-
在JSP中使用JavaScript获取Java变量的值和对象的方法
-
Python: 找出矩阵的最大特征值及其对应特征向量的方法
-
使用JavaScript修改CSS属性值的方法
-
赢得CVPR2023轨迹预测比赛的冠军方法!介绍全新一代的多智能体联合轨迹预测框架:QCNeXt