相似变换#
形状保持不变,只改变位置、大小和方向
Hsimilarity=s⋅cosθs⋅sinθ0−s⋅sinθs⋅cosθ0txty1
- s:缩放因子s>0
- θ:旋转角度
- (tx,ty):平移向量
相似变换有4个自由度:1+1+2
仿射变换#
平行线保持不变,但不保持形状,在相似变换的基础上增加了剪切操作
Haffine=ac0bd0txty1
- a,b,c,d:线性变换矩阵的元素,包含缩放、旋转和剪切信息
- (tx,ty):平移向量
当a=d=scosθ且b=−c=−ssinθ时,仿射变换退化为相似变换
仿射变换有6个自由度:4+2
单应变换/投影变换/透视变换#
直线保持不变,但不保持平行线,在仿射变换的基础上增加了透视效果
Hhomography=h11h21h31h12h22h32h13h23h33 通常将h33归一化为1,所以单应变换有8个自由度:9-1
当h31=h32=0且h33已归一化时,单应变换退化为仿射变换
最小二乘拟合求单应矩阵#
现在我们有一对点(x,y)和(x′,y′),以及单应矩阵H,满足:
ωx′y′1=Hxy1
ω是一个缩放因子,因为h33不一定归一化为1
展开后得到:
⎩⎨⎧ωx′=h11x+h12y+h13ωy′=h21x+h22y+h23ω=h31x+h32y+h33 整理一下:
{h11x+h12y+h13−h31xx′−h32yy′−h33x′=0h21x+h22y+h23−h31xy′−h32yy′−h33y′=0 可以写成矩阵形式了:
[x0y0100x0y01−xx′−xy′−yx′−yy′−x′−y′]h11h12h13h21h22h23h31h32h33=0 由于单应矩阵有8个自由度,从上述矩阵可以看到一对点提供了两行约束,所以至少需要4对点才能求解单应矩阵
实际实现中通常使用更多的点来构建一个过约束的系统,然后通过最小二乘法来求解单应矩阵,以提高鲁棒性和精度
所以得到n对点后可以写出:
A=x10x20⋮xn0y10y20⋮yn01010⋮100x10x2⋮0xn0y10y2⋮0yn0101⋮01−x1x1′−x1y1′−x2x2′−x2y2′⋮−xnxn′−xnyn′−y1x1′−y1y1′−y2x2′−y2y2′⋮−ynxn′−ynyn′−x1′−y1′−x2′−y2′⋮−xn′−yn′ 得到:
Ah=0 为避免解出h=0的平凡解,通常会添加约束条件∥h∥=1
将问题形式化#
hmin∥Ah∥2subject to∥h∥=1 拉格朗日乘数法#
构造拉格朗日函数:
L(h,λ)=∥Ah∥2−λ(∥h∥2−1)=hTATAh−λ(hTh−1) 对h求导并设置为零:
∂h∂L=2ATAh−2λhATAh=0=λh 所以解h是矩阵ATA的特征向量,对应的特征值为λ
由于我们要最小化∥Ah∥2,也就是最小化hTATAh,对特征方程变形一下:
hTATAh=λhTh(约束∥h∥=1)=λ 所以取minλ(最小特征值)对应的特征向量h(9x1),并将其重塑(np.reshape)为3x3矩阵,即为求解得到的单应矩阵H