Thin Plate Spline (薄板样条函数)(TPS)

一直不太明白TPS是什么东西,今天特地上网查了一下,总结如下:

1. TPS是一种插值方法,它寻找一个通过所有的控制点的弯曲最小的光滑曲面;就像一个薄铁板,通过所给定的几个“样条”(比如木条),铁板表面是光滑的。弯曲最小由一个能量函数定义,就是wiki上的那个双重积分。

2. 对于3个不共线的控制点,TPS是一个平面,多于三个是一个曲面,少于三个则是未定义的。

3. TPS常用来对形状进行 non-rigid 变形,比如给定原始形状的有限点集A,变形后的对应目标点集B,设C=B-A,对(Ax,Ay, Cx)拟合出一个TPS,就可以得到x方向的内插函数;对(Ax,Ay, Cy)拟合出来的TPS则可以得到y方向的内插函数。这样一以来对于不在点集中的点,我们就可以插值得到目标点。从而完成整个面的变形。

4. 某些情况下数据(控制点坐标)可能存在噪声,这时可能会放松要求,TPS得到的曲面不一定要通过所有的控制点(类比B样条),这就是正则化(regularization ),并由一个正则化参数λ控制。如果λ=0就是普通的TPS,如果λ为无穷大,TPS就退化为均方误差最小平面(平面的弯曲量为0),对于变形操作来说就是一般的仿射变换。

5. TPS是一种径向基函数,径向基函数主要是用来解决插值问题的,这种函数只与到某个点的距离有关,所以叫径向,又因为它们是函数空间中用来逼近函数的基(类似于多项式函数或三角函数),所以叫径向基。

6. 仿射变换保持点的共线性和直线的平行性,可由平移、旋转、缩放、翻转(Flip)和错切(Shear)变换等原子操作叠加实现。平移、旋转、翻转(Flip)不会改变物体形状,属于刚性(rigid)变换。注意错切变换不是Photoshop中的斜切(只拖动一个控制点),后者不保持直线的平行性。仿射变换是线性的,透视变换不是线性的。

7. 正定阵是可逆的。

8. TPS是非参,有解析解(Closed-form solution)的。

TPS的C++程序示例:http://elonen.iki.fi/code/tpsdemo/
Wiki上的TPS:http://en.wikipedia.org/wiki/Thin_plate_spline
RBF介绍:http://www.farfieldtechnology.com/products/toolbox/theory/rbffaq.html
径向基函数:http://166.111.121.20:9218/fedora/get/mathjourpaper:SXJZ803001/fedora-system:3/getItem?itemID=DS1

转载于:https://www.cnblogs.com/mysunnyday/archive/2011/08/27/2155375.html

薄板样条插值(Thin Plate Spline)是一种用于拟合二维或三维数据的插值方法。它通过在数据点之间构建一个薄板模型来进行插值。薄板样条插值方法的精度可以通过以下步骤进行验证: 1. 收集数据点:首先,收集一组二维或三维数据点,这些数据点包含了你想要进行插值的区域。 2. 构建薄板模型:使用收集到的数据点,构建薄板模型。薄板模型是一个基于数据点的函数,它可以通过最小化一个能量函数来确定。这个能量函数包括两个部分:平滑项和弯曲项。平滑项用于确保薄板模型在数据点之间是平滑的,而弯曲项用于确保薄板模型在数据点之外是平坦的。 3. 计算插值结果:使用构建好的薄板模型,对于给定的输入点,计算其对应的插值结果。插值结果可以是一个标量值(如灰度值)或一个向量值(如RGB通道值)。 4. 精度验证:为了验证薄板样条插值方法的精度,可以使用一些已知的数据点进行测试。将这些已知数据点输入到薄板模型中,然后与已知的真实值进行比较。通过计算插值结果与真实值之间的误差,可以评估薄板样条插值方法的精度。 下面是一个示例代码,演示了如何使用Python中的scipy库进行薄板样条插值的精度验证: ```python import numpy as np from scipy.interpolate import Rbf # 收集数据点 x = np.array([0, 1, 2, 3, 4]) y = np.array([0, 1, 2, 3, 4]) z = np.array([0, 1, 4, 9, 16]) # 构建薄板模型 rbf = Rbf(x, y, z) # 计算插值结果 xi = np.array([0.5, 1.5, 2.5, 3.5]) yi = np.array([0.5, 1.5, 2.5, 3.5]) zi = rbf(xi, yi) # 精度验证 true_values = np.array([0.5, 2.5, 6.5, 12.5]) errors = np.abs(zi - true_values) mean_error = np.mean(errors) print("插值结果:", zi) print("平均误差:", mean_error) ``` 这段代码中,我们首先收集了一组数据点(x, y, z),然后使用Rbf函数构建了薄板模型。接下来,我们使用xi和yi作为输入点,计算其对应的插值结果zi。最后,我们将插值结果与已知的真实值进行比较,计算平均误差。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值