Thin plate spline 薄板样条插值是一种插值算法,经常用于图像变形(image warping)等,通过少量的控制点就可以驱动图像进行变化。
TPS
既然是插值方法,就从插值开始说起。
插值,简单来说就是近似,用一个插值函数去近似我们已经知道的数据,近似的结果和真实结果间的差值也表示了插值函数的好坏。常见的插值函数有多项式函数,样条函数等。
给定L个点
{xi,yi}Li=1
以及他们对应的函数值
vi,i=1,2,⋯,L
. TPS插值的目标就是求解一个函数
f
,使得
J(ϕ)=∑2j=1∬(∂2ϕj∂x2)2+2(∂2ϕj∂x∂y)2+(∂2ϕj∂y2)2dxdy
可以证明TPS的插值函数就是使得弯曲能量最小的函数。
f(x,y)=a0+a1+a2+∑Li=1ωiϕ(s)
其中
ϕ(⋅)
是一个样条函数
s是矩阵S的元素, si,j=∥Pi−Pj∥2 。
TPS插值函数有 L+3 个参数,条件 f(x,y)=v 只有L个,需要添加约束才能求解,我们再添加三个约束:
∑Lk=1ωk=0
∑Lk=1xiωk=0
∑Lk=1yiωk=0
TPS插值函数的参数可以通过求解如下方程组求得:
Q=[11×L;X;Y] , a,ω,v 都是已知的向量表示。当有噪声存在时(或者说允许有一定的误差),我们可以引入一个正则项 λ 来控制TPS插值的平滑程度,具体做法就是在样条函数的作用矩阵S上做文章,令 S=S+λI , I 是一个单位矩阵。
以上是TPS插值得到函数值的具体方法。更多的,我们一般操作的都是二维平面的点。对于这种情况,只需要将x和y坐标分开看待,求解两个TPS插值函数即可。例如我们有N个对应
我们求得TPS插值函数之后,如何利用TPS插值函数计算新的点插值之后的位置呢? (x,y) 经过TPS插值之后的位置 (x′,y′) 可通过下式计算:
其中 B(i,j)=∥(xi,yi)−(ui,vi)∥2 .
image warping
利用TPS插值做图像变形,只需要制定对应的控制点的坐标,然后根据TPS函数对图像所有像素点进行插值,求得插值之后的位置,进行像素值映射就可以,这种一般也叫作后向插值法,会出现有些点经过插值后不再属于图像范围内,舍弃掉即可。对应的还有种插值方法叫前向插值法,就是对变形后的图像每个像素点求它在原图像中的位置,感兴趣的可以看看。
PS:第一篇博文,鼓励自己,再接再厉!