アフィン変換とホモグラフィ変換

アフィン変換とホモグラフィ変換とは?

  • アフィン変換:正方形を任意の平行四辺形に写せる (台形など任意の四角形には写せない)
  • モグラフィ変換:正方形を任意の四角形に写せる

アフィン変換について

  • 3×3の行列で表現できる (実質は2×2の行列と2次の列ベクトルで6変数)
    \begin{pmatrix} x' \\ y' \\ 1 \end{pmatrix} = \begin{pmatrix} a & b & c \\ d & e & f \\ 0 & 0 & 1 \end{pmatrix}\begin{pmatrix} x \\ y \\ 1 \end{pmatrix}
  • 拡大縮小、平行移動、回転、せん断(スキュー) からなる
  • 拡大縮小は対角行列
    \begin{pmatrix} x' \\ y' \\ 1 \end{pmatrix} = \begin{pmatrix} S_x & 0 & 0 \\ 0 & S_y & 0 \\ 0 & 0 & 1 \end{pmatrix}\begin{pmatrix} x \\ y \\ 1 \end{pmatrix}
  • 平行移動は単位行列と列ベクトル
    \begin{pmatrix} x' \\ y' \\ 1 \end{pmatrix} = \begin{pmatrix} 1 & 0 & T_x \\ 0 & 1 & T_y \\ 0 & 0 & 1 \end{pmatrix}\begin{pmatrix} x \\ y \\ 1 \end{pmatrix}
  • 回転は回転行列
    \begin{pmatrix} x' \\ y' \\ 1 \end{pmatrix} = \begin{pmatrix} \cos\theta & -\sin\theta & 0 \\ \sin\theta & \cos\theta & 0 \\ 0 & 0 & 1 \end{pmatrix}\begin{pmatrix} x \\ y \\ 1 \end{pmatrix}
  • せん断は単位三角行列
    \begin{pmatrix} x' \\ y' \\ 1 \end{pmatrix} = \begin{pmatrix} 1 & \tan\theta & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{pmatrix}\begin{pmatrix} x \\ y \\ 1 \end{pmatrix} (x軸方向にせん断)

    \begin{pmatrix} x' \\ y' \\ 1 \end{pmatrix} = \begin{pmatrix} 1 & 0 & 0 \\ \tan\theta & 1 & 0 \\ 0 & 0 & 1 \end{pmatrix}\begin{pmatrix} x \\ y \\ 1 \end{pmatrix} (y軸方向にせん断)

モグラフィ変換 (射影変換) について

  • 任意の4点  (x_i, y_i), i∈[0,1,2,3] を 任意の4点 (x'_i, y'_i)に写す。
  • \begin{pmatrix} x' \\ y' \end{pmatrix} = \begin{pmatrix} X'/W' \\ Y'/W' \end{pmatrix}

    \begin{pmatrix} X' \\ Y' \\ W' \end{pmatrix} = \begin{pmatrix} h_{00} & h_{01} & h_{02} \\ h_{10} & h_{11} & h_{12} \\ h_{20} & h_{21} & 1 \end{pmatrix} \begin{pmatrix} x \\ y \\ 1 \end{pmatrix}
     
  • ※ 行列を定数倍しても同じなので h_{22} = 1 となるように正規化している。
  • 式を展開して  (x_i, y_i) (x'_i, y'_i) を代入すると
     \begin{pmatrix} x'_0 \\ y'_0 \\ x'_1 \\ y'_1 \\ x'_2 \\ y'_2 \\ x'_3 \\ y'_3 \end{pmatrix} = \begin{pmatrix} x_0 & y_0 & 1 & 0   & 0   & 0 & -x_0x'_0 & -y_0x'_0 \\ 0 &   0 & 0 & x_0 & y_0 & 1 & -x_0y'_0 & -y_0y'_0 \\ x_1 & y_1 & 1 & 0   & 0   & 0 & -x_1x'_1 & -y_1x'_1 \\ 0 &   0 & 0 & x_1 & y_1 & 1 & -x_1y'_1 & -y_1y'_1 \\  x_2 & y_2 & 1 & 0   & 0   & 0 & -x_2x'_2 & -y_2x'_2 \\ 0 &   0 & 0 & x_2 & y_2 & 1 & -x_2y'_2 & -y_2y'_2 \\ x_3 & y_3 & 1 & 0   & 0   & 0 & -x_3x'_3 & -y_3x'_3 \\ 0 &   0 & 0 & x_3 & y_3 & 1 & -x_3y'_3 & -y_3y'_3 \end{pmatrix}\begin{pmatrix} h_{00} \\ h_{01} \\ h_{02} \\ h_{10} \\ h_{11} \\ h_{12} \\ h_{20} \\ h_{21} \end{pmatrix} …①
     
  • これの逆行列を求めるとホモグラフィ変換行列 H が得られる。
     \begin{pmatrix} h_{00} \\ h_{01} \\ h_{02} \\ h_{10} \\ h_{11} \\ h_{12} \\ h_{20} \\ h_{21} \end{pmatrix} = \begin{pmatrix} x_0 & y_0 & 1 & 0   & 0   & 0 & -x_0x'_0 & -y_0x'_0 \\ 0 &   0 & 0 & x_0 & y_0 & 1 & -x_0y'_0 & -y_0y'_0 \\ x_1 & y_1 & 1 & 0   & 0   & 0 & -x_1x'_1 & -y_1x'_1 \\ 0 &   0 & 0 & x_1 & y_1 & 1 & -x_1y'_1 & -y_1y'_1 \\  x_2 & y_2 & 1 & 0   & 0   & 0 & -x_2x'_2 & -y_2x'_2 \\ 0 &   0 & 0 & x_2 & y_2 & 1 & -x_2y'_2 & -y_2y'_2 \\ x_3 & y_3 & 1 & 0   & 0   & 0 & -x_3x'_3 & -y_3x'_3 \\ 0 &   0 & 0 & x_3 & y_3 & 1 & -x_3y'_3 & -y_3y'_3 \end{pmatrix}^{-1}\begin{pmatrix} x'_0 \\ y'_0 \\ x'_1 \\ y'_1 \\ x'_2 \\ y'_2 \\ x'_3 \\ y'_3 \end{pmatrix} …②

モグラフィ変換の特殊解を解析的に解く

  • たいていの用途では、写像元/写像先のいずれか一方は、x軸とy軸に平行な長方形であり、これは単位正方形に正規化できる。この場合、①の方程式はかなり簡単になる。
  •  (x_0, y_0), (x_1, y_1), (x_2, y_2), (x_3, y_3) = (0, 0), (1, 0), (1, 1), (0, 1) とすると

     \begin{pmatrix} 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 \\ 1 & 0 & 1 & 0 & 0 & 0 & -x'_1 & 0 \\ 0 & 0 & 0 & 1 & 0 & 1 & -y'_1 & 0 \\ 1 & 1 & 1 & 0 & 0 & 0 & -x'_2 & -x'_2 \\ 0 & 0 & 0 & 1 & 1 & 1 & -y'_2 & -y'_2 \\ 0 & 1 & 1 & 0 & 0 & 0 & 0 & -x'_3 \\ 0 & 0 & 0 & 0 & 1 & 1 & 0 & -y'_3 \end{pmatrix} \begin{pmatrix} h_{00} \\ h_{01} \\ h_{02} \\ h_{10} \\ h_{11} \\ h_{12} \\ h_{20} \\ h_{21} \end{pmatrix} = \begin{pmatrix} x'_0 \\ y'_0 \\ x'_1 \\ y'_1 \\ x'_2 \\ y'_2 \\ x'_3 \\ y'_3 \end{pmatrix} …③
  • これを解くと
     h_{02} = x'_0  ,  h_{12} = y'_0

     A = x'_1 - x'_2 ,  B = x'_3 - x'_2 ,  C = x'_0 - x'_1 + x'_2 - x'_3
     D = y'_1 - y'_2 ,  E = y'_3 - y'_2 ,  F = y'_0 - y'_1 + y'_2 - y'_3
    h_{20} = \dfrac{CE - BF}{AE - BD} ,  h_{21} = \dfrac{AF - CD}{AE - BD}

     h_{00} = x'_1 - x'_0 + x'_1 h_{20}
     h_{10} = y'_1 - y'_0 + y'_1 h_{20}
     h_{01} = x'_3 - x'_0 + x'_3 h_{21}
     h_{11} = y'_3 - y'_0 + y'_3 h_{21}
     
  • ※計算メモ → メモ1, メモ2
  • 逆に単位正方行列への変換であれば上記のホモグラフィ行列 H の逆行列を用いればよい。( H は3×3行列であるから公式で計算すればよい。)
  • 行列計算のライブラリを利用して② の逆行列数値計算で解けるならそれでもよし。
  • そのようなライブラリが利用できない環境の場合、ここで述べた特殊解を利用すれば、実装が比較的容易であり、計算量も少なくて済む。

Pythonによる実装例

  • HomographyTest1.py は ② の逆行列数値計算で解くやり方
  • HomographyTest2.py は ③ の解析解を解くやり方