961 字
5 分钟
[计算机视觉] 各类图像变换

相似变换#

形状保持不变,只改变位置、大小和方向

Hsimilarity=[scosθssinθtxssinθscosθty001]H_\text{similarity} = \begin{bmatrix}s \cdot \cos\theta & -s \cdot \sin\theta & t_x \\ s \cdot \sin\theta & s \cdot \cos\theta & t_y \\ 0 & 0 & 1 \end{bmatrix}
  • ss:缩放因子s>0s > 0
  • θ\theta:旋转角度
  • (tx,ty)(t_x, t_y):平移向量

相似变换有4个自由度:1+1+2

仿射变换#

平行线保持不变,但不保持形状,在相似变换的基础上增加了剪切操作

Haffine=[abtxcdty001]H_\text{affine} = \begin{bmatrix}a & b & t_x \\ c & d & t_y \\ 0 & 0 & 1 \end{bmatrix}
  • a,b,c,da, b, c, d:线性变换矩阵的元素,包含缩放、旋转和剪切信息
  • (tx,ty)(t_x, t_y):平移向量

a=d=scosθa = d = s\cos\thetab=c=ssinθb = -c = -s\sin\theta时,仿射变换退化为相似变换

仿射变换有6个自由度:4+2

单应变换/投影变换/透视变换#

直线保持不变,但不保持平行线,在仿射变换的基础上增加了透视效果

Hhomography=[h11h12h13h21h22h23h31h32h33]H_\text{homography} = \begin{bmatrix}h_{11} & h_{12} & h_{13} \\ h_{21} & h_{22} & h_{23} \\ h_{31} & h_{32} & h_{33} \end{bmatrix}

通常将h33h_{33}归一化为1,所以单应变换有8个自由度:9-1

h31=h32=0h_{31} = h_{32} = 0h33h_{33}已归一化时,单应变换退化为仿射变换

最小二乘拟合求单应矩阵#

现在我们有一对点(x,y)(x, y)(x,y)(x', y'),以及单应矩阵HH,满足:

ω[xy1]=H[xy1]\omega\begin{bmatrix}x' \\ y' \\ 1\end{bmatrix} = H \begin{bmatrix}x \\ y \\ 1\end{bmatrix}

ω\omega是一个缩放因子,因为h33h_{33}不一定归一化为1

展开后得到:

{ωx=h11x+h12y+h13ωy=h21x+h22y+h23ω=h31x+h32y+h33\begin{cases} \omega x' = h_{11}x + h_{12}y + h_{13} \\ \omega y' = h_{21}x + h_{22}y + h_{23} \\ \omega = h_{31}x + h_{32}y + h_{33} \end{cases}

整理一下:

{h11x+h12y+h13h31xxh32yyh33x=0h21x+h22y+h23h31xyh32yyh33y=0\begin{cases} h_{11}x + h_{12}y + h_{13} - h_{31}xx' - h_{32}yy' - h_{33}x' = 0 \\ h_{21}x + h_{22}y + h_{23} - h_{31}xy' - h_{32}yy' - h_{33}y' = 0 \end{cases}

可以写成矩阵形式了:

[xy1000xxyxx000xy1xyyyy][h11h12h13h21h22h23h31h32h33]=0\begin{bmatrix} x & y & 1 & 0 & 0 & 0 & -xx' & -yx' & -x' \\ 0 & 0 & 0 & x & y & 1 & -xy' & -yy' & -y' \end{bmatrix} \begin{bmatrix}h_{11} \\ h_{12} \\ h_{13} \\ h_{21} \\ h_{22} \\ h_{23} \\ h_{31} \\ h_{32} \\ h_{33}\end{bmatrix} = \mathbf{0}

由于单应矩阵有8个自由度,从上述矩阵可以看到一对点提供了两行约束,所以至少需要4对点才能求解单应矩阵

实际实现中通常使用更多的点来构建一个过约束的系统,然后通过最小二乘法来求解单应矩阵,以提高鲁棒性和精度

所以得到nn对点后可以写出:

A=[x1y11000x1x1y1x1x1000x1y11x1y1y1y1y1x2y21000x2x2y2x2x2000x2y21x2y2y2y2y2xnyn1000xnxnynxnxn000xnyn1xnynynynyn]\mathbf{A} = \begin{bmatrix} x_1 & y_1 & 1 & 0 & 0 & 0 & -x_1x_1' & -y_1x_1' & -x_1' \\ 0 & 0 & 0 & x_1 & y_1 & 1 & -x_1y_1' & -y_1y_1' & -y_1' \\ x_2 & y_2 & 1 & 0 & 0 & 0 & -x_2x_2' & -y_2x_2' & -x_2' \\ 0 & 0 & 0 & x_2 & y_2 & 1 & -x_2y_2' & -y_2y_2' & -y_2' \\ \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots \\ x_n & y_n & 1 & 0 & 0 & 0 & -x_nx_n' & -y_nx_n' & -x_n' \\ 0 & 0 & 0 & x_n & y_n & 1 & -x_ny_n' & -y_ny_n' & -y_n' \end{bmatrix}

得到:

Ah=0\mathbf{A} \mathbf{h} = \mathbf{0}

为避免解出h=0\mathbf{h} = \mathbf{0}的平凡解,通常会添加约束条件h=1\|\mathbf{h}\| = 1

将问题形式化#

minhAh2subject toh=1\begin{aligned} \underset{\mathbf{h}}{\min} \|\mathbf{A} \mathbf{h}\|^2 \quad \text{subject to} \quad \|\mathbf{h}\| = 1 \end{aligned}

拉格朗日乘数法#

构造拉格朗日函数:

L(h,λ)=Ah2λ(h21)=hTATAhλ(hTh1)\begin{aligned} \mathcal{L}(\mathbf{h}, \lambda) &= \|\mathbf{A} \mathbf{h}\|^2 - \lambda (\|\mathbf{h}\|^2 - 1) \\[1em] &= \mathbf{h}^T \mathbf{A}^T \mathbf{A} \mathbf{h} - \lambda (\mathbf{h}^T \mathbf{h} - 1) \end{aligned}

h\mathbf{h}求导并设置为零:

Lh=2ATAh2λh=0ATAh=λh\begin{aligned} \frac{\partial \mathcal{L}}{\partial \mathbf{h}} = 2 \mathbf{A}^T \mathbf{A} \mathbf{h} - 2 \lambda \mathbf{h} &= \mathbf{0} \\[1em] \mathbf{A}^T \mathbf{A} \mathbf{h} &= \lambda \mathbf{h} \end{aligned}

所以解h\mathbf{h}是矩阵ATA\mathbf{A}^T \mathbf{A}的特征向量,对应的特征值为λ\lambda

由于我们要最小化Ah2\|\mathbf{A} \mathbf{h}\|^2,也就是最小化hTATAh\mathbf{h}^T \mathbf{A}^T \mathbf{A} \mathbf{h},对特征方程变形一下:

hTATAh=λhTh(约束h=1)=λ\begin{aligned} \mathbf{h}^T \mathbf{A}^T \mathbf{A} \mathbf{h} &= \lambda \mathbf{h}^T \mathbf{h} \qquad (\text{约束}\|\mathbf{h}\| = 1) \\[1em] &= \lambda \end{aligned}

所以取minλ\min \lambda(最小特征值)对应的特征向量h\mathbf{h}(9x1),并将其重塑(np.reshape)为3x3矩阵,即为求解得到的单应矩阵HH

[计算机视觉] 各类图像变换
https://alkaid114.github.io/posts/cv/transform/
作者
Alkaid114
发布于
2026-06-06
许可协议
CC BY-NC-SA 4.0