Thin Plate
薄板样条插值可以为一组对应的控制点提供光滑的插值结果,通过一组控制点,可以得到一个“平面”(不一定是二维平面),穿过这组控制点,并使得“平面”的弯曲能量(bending energy)最小。
穿过一组特征点的2D平面
图示的弯曲屏幕可以通过如下公式得到:
前三个参数可以看作是仿射变换
, 第四个变换参数是关于使得“平面”弯曲以通过给定控制点。是径向基函数。中的和都是控制点坐标,(1)总共有个弯曲参数和个仿射参数,其中为控制点的维度。
我们可以化简公式(1)为:, 其中。我们接着定义, 。其中表示控制点的坐标(以二维为例),。我们可以将和组合得到:。这时,从公式(2)就可以推广到个控制点的情形:
其中, , , , , , 表示在控制点的“高度”。
How to calculate the TPS parameters
由于L是一个对称矩阵,,我们可以得到一组控制点关于某个维度的TPS参数(如上图所示,我们有7个控制点,每个控制点都有其“高度”,我们便可通过TPS拟合出一个平面,通过这些高度值)。但如果是Deformaition的话(假设我们将img1“扭曲”得到img2),我们已知的是一组控制点的对应关系,即与是对应的,我们便需要两组TPS参数来将图片“扭曲”。
左图是原图,右图是扭曲之后的图片
左图是表示x方向的形变,右图表示y方向形变(与上图对应)
以嘴角为例,可以看到x方向上的“高度”为0,而y方向上的“高度”却有很大的值。
How to conduct image warping
现假设我们已经求得了一组图片之间的TPS参数分别代表x方向和y方向。我们可以根据下面这个公式求得“扭曲”之后的点的位置(其实就是公式(1))。
其中,表示上面提到的img1中的控制点,而表示任意一组待扭曲的图片初始像素坐标,我们这里记为img3。而则表示两个点之间的欧式距离。如果img3有M个点,则得到的值其维度是。那么就可以得到扭曲后的坐标:。代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| % MATLAB [N1,N2]=size(img3); % 获取img3的高,宽 [x,y]=meshgrid(1:N2,1:N1); % 由于初始图像未扭曲,其做为整数,可以这样获取 x=x(:);y=y(:);M=length(x); % cx: 为x方向形变参数,其维度与img1中控制点个数有关,这里就是n_good+3,n_good就是控制点个数 fx_aff=cx(n_good+1:n_good+3)'*[ones(1,M); x'; y']; %公式(1)前三个项的实现 d2=dist2(X3b,[x y]); %X3b: (n_good * 2) d2: (n_good * N) fx_wrp=cx(1:n_good)'*(d2.*log(d2+eps)); %fx_wrp: (1 * N) fx=fx_aff+fx_wrp; fy_aff=cy(n_good+1:n_good+3)'*[ones(1,M); x'; y']; fy_wrp=cy(1:n_good)'*(d2.*log(d2+eps)); fy=fy_aff+fy_wrp;
%% %% 接下来就是根据扭曲后的坐标【fx, fy】进行插值 %%
|
Reference
Manual Registration with Thin Plates