欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Java样条插值法滤波:探索样条插值的特性

最编程 2024-01-18 08:51:31
...


Thin plate spline 薄板样条插值是一种插值算法,经常用于图像变形(image warping)等,通过少量的控制点就可以驱动图像进行变化。

TPS

既然是插值方法,就从插值开始说起。
插值,简单来说就是近似,用一个插值函数去近似我们已经知道的数据,近似的结果和真实结果间的差值也表示了插值函数的好坏。常见的插值函数有多项式函数,样条函数等。
给定L个点 {xi,yi}Li=1以及他们对应的函数值vi,i=1,2,⋯,L. TPS插值的目标就是求解一个函数f,使得f(x,y)=v,并且弯曲能量函数最小。我们把插值函数想象成用力去弯折一块薄钢板,使这块钢板穿过给定的L个点,弯曲这块钢板所需的力或者能量可以表示为:
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)={s2logs20si,j≠0otherwise.


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插值函数的参数可以通过求解如下方程组求得:



[SQTQO3×3][ωa]=[v0]

Q=[11×L;X;Y],a,ω,v 都是已知的向量表示。当有噪声存在时(或者说允许有一定的误差),我们可以引入一个正则项 λ 来控制TPS插值的平滑程度,具体做法就是在样条函数的作用矩阵S上做文章,令S=S+λI, I

以上是TPS插值得到函数值的具体方法。更多的,我们一般操作的都是二维平面的点。对于这种情况,只需要将x和y坐标分开看待,求解两个TPS插值函数即可。例如我们有N个对应{xi,yi}Ni=1和{ui,vi}Ni=1,则求解方程组如下:



[SQTQO3×3][ωxaxωyay]=[u0v0]

我们求得TPS插值函数之后,如何利用TPS插值函数计算新的点插值之后的位置呢?(x,y)经过TPS插值之后的位置(x′,y′)可通过下式计算:



[x′y′]=[ϕ(B)Q][ωxaxωyay]

其中B(i,j)=∥(xi,yi)−(ui,vi)∥2.

image warping

利用TPS插值做图像变形,只需要制定对应的控制点的坐标,然后根据TPS函数对图像所有像素点进行插值,求得插值之后的位置,进行像素值映射就可以,这种一般也叫作后向插值法,会出现有些点经过插值后不再属于图像范围内,舍弃掉即可。对应的还有种插值方法叫前向插值法,就是对变形后的图像每个像素点求它在原图像中的位置,感兴趣的可以看看。

PS:第一篇博文,鼓励自己,再接再厉!