DLT(Direct Linear Transformation:直接線形変換)

幾つか記事を見たり、文献を観たいしたけどいまいちわからなかったので整理。

特異値分解(SVD)を用いて最小二乗法によりHomographyを求める。

{\displaystyle x'_i=Hx_i}
明らかに
{\displaystyle x'_i \times Hx_i=0}
(これは |a| \times |a|=0 より明らか)
{\displaystyle
  H = 
  \left(
    \begin{array}{ccc}
      h_{11} & h_{12} & h_{13} \\
      h_{21} & h_{22} & h_{23} \\
      h_{31} & h_{32} & h_{33}
    \end{array}
  \right) = 
  \left(
    \begin{array}{ccc}
      h_1^{\mathrm{T}} \\
      h_2^{\mathrm{T}} \\
      h_3^{\mathrm{T}}
    \end{array}
  \right)
}
と置くと
{\displaystyle
  Hx_i = \left(
    \begin{array}{c}
      h_1^{\mathrm{T}} x_i\\
      h_2^{\mathrm{T}} x_i\\
      h_3^{\mathrm{T}} x_i
    \end{array}
  \right),
  x'_i = \left(
    \begin{array}{c}
      x'_i\\
      y'_i\\
      w'_i
    \end{array}
  \right)
}
よって、クロス積の定義より
{\displaystyle
x'_i \times Hx_i = \left(
    \begin{array}{cc}
      y'_i h_3^{\mathrm{T}} - w_i' h_2^{\mathrm{T}} x_i\\
      w'_i h_1^{\mathrm{T}} - x_i' h_3^{\mathrm{T}} x_i\\
      x'_i h_2^{\mathrm{T}} - y_i' h_1^{\mathrm{T}} x_i
    \end{array}
  \right) = 0
}
これを書き換えると
{\displaystyle
x'_i \times Hx_i = \left(
    \begin{array}{ccc}
      0^{\mathrm{T}}         & -w'_i x_i^{\mathrm{T}} &  y'_i x_i^{\mathrm{T}} \\
      w'_i x_i^{\mathrm{T}}  & 0^{\mathrm{T}}         & -x'_i x_i^{\mathrm{T}} \\
      -y'_i x_i^{\mathrm{T}} & x'_i x_i^{\mathrm{T}}  & 0^{\mathrm{T}}
    \end{array}
  \right) 
  \left(
    \begin{array}{c}
      h_1 \\
      h_2 \\
      h_3
    \end{array}
  \right) = 0
}
H はn倍しても等価なので最後の行は削除できる。
{\displaystyle x'_i} は同次座標系なので {\displaystyle w'_i=1}ととると
{\displaystyle
  \left(
    \begin{array}{ccccccccc}
      0   & 0   & 0   & -x_i & -y_i & -w_i &  y'_i x_i &  y'_i y_i &  y'_i w_i \\
      x_i & y_i & w_i & 0    & 0    & 0    & -x'_i x_i & -x'_i y_i & -x'_i w_i \\
    \end{array}
  \right) 
  \left(
    \begin{array}{c}
      h_1 \\
      h_2 \\
      h_3
    \end{array}
  \right) = 0
}
{\displaystyle w_i=1}と置く。また、各要素がゼロになるので符号をそろえて見やすくすると
{\displaystyle
  \left(
    \begin{array}{ccccccccc}
       0   &  0   &  0   & -x_i & -y_i & -1   &  y'_i x_i &  y'_i y_i &  y'_i w_i \\
      -x_i & -y_i & -1   & 0    & 0    & 0    &  x'_i x_i &  x'_i y_i &  x'_i w_i \\
    \end{array}
  \right) 
  \left(
    \begin{array}{c}
      h_{11} \\
      h_{12} \\
      h_{13} \\
      h_{21} \\
      h_{22} \\
      h_{23} \\
      h_{31} \\
      h_{32} \\
      h_{33} \\
    \end{array}
  \right) = 0
}
n個の座標を対象にすると下記のようにかける。
{\displaystyle
  \left(
    \begin{array}{ccccccccc}
       0   &  0   &  0   & -x_1 & -y_1 & -1   &  y'_1 x_1 &  y'_1 y_i &  y'_1 w_1 \\
      -x_1 & -y_1 & -1   & 0    & 0    & 0    &  x'_1 x_1 &  x'_1 y_i &  x'_1 w_1 \\
       0   &  0   &  0   & -x_2 & -y_2 & -2   &  y'_2 x_2 &  y'_2 y_2 &  y'_2 w_2 \\
      -x_2 & -y_2 & -1   & 0    & 0    & 0    &  x'_2 x_2 &  x'_2 y_2 &  x'_2 w_2 \\
           &      &      &      & \vdots
    \end{array}
  \right) 
  \left(
    \begin{array}{c}
      h_{11} \\
      h_{12} \\
      h_{13} \\
      h_{21} \\
      h_{22} \\
      h_{23} \\
      h_{31} \\
      h_{32} \\
      h_{33} \\
    \end{array}
  \right) = 0
}
{\displaystyle
Mx=0
}
これを特異値分解(SVD)を使って説く。
つづく。

参考:

Direct Linear Transform アルゴリズムを使って、投影変換の行列Hを計算する。 - ぱたヘネ
(ほぼこの記事に自分が読んでわからなかったところを書き足した感じ)

これなら分かる応用数学教室―最小二乗法からウェーブレットまで

これなら分かる応用数学教室―最小二乗法からウェーブレットまで

実践 コンピュータビジョン

実践 コンピュータビジョン