Homography変換

はじめに

今回は、Affine変換とHomography変換について説明する。

Affine変換

2次元ベクトル\vec{x}に対する次の変換を考える。

(1)    \begin{equation*} \vec{x}^{\;\prime}=A\vec{x}+\vec{b} \end{equation*}

ここで

(2)    \begin{eqnarray*} \vec{x}^{\;\prime}&=& \begin{pmatrix} x^{\prime} \\ y^{\prime} \end{pmatrix}, \;\; \vec{x}= \begin{pmatrix} x \\ y \end{pmatrix},\;\; \vec{b}= \begin{pmatrix} b_1 \\ b_2 \end{pmatrix} \\ A&=& \begin{pmatrix} a_{11} &a_{12} \\ a_{21} &a_{22} \end{pmatrix} \end{eqnarray*}

である。これらを代入して、成分で書き直すと

(3)    \begin{eqnarray*} x^{\prime}&=&a_{11}x+a_{12}y+b_1 \\ y^{\prime}&=&a_{21}x+a_{22}y+b_2 \end{eqnarray*}

を得る。これは以下のように書き換えることができる。

(4)    \begin{equation*} \left( \begin{array}{c} x^{\prime}\\ y^{\prime} \end{array} \right) = \left( \begin{array}{ccc} a_{11} & a_{12}&b_1 \\ a_{21} & a_{22}&b_2 \end{array} \right) \left( \begin{array}{c} x \\ y \\ 1 \end{array} \right) \end{equation*}

上の行列は6個のパラメータを持つ。これらを一意に決めるには既知の点の組み(\vec{x},\vec{x}^{\;\prime})が3つあれば良い。これら3組みから決まる変換(1)をAffine変換と呼ぶ。ところで、式(4)は次式のように書くこともできる。

(5)    \begin{eqnarray*} \left( \begin{array}{c} X\\ Y\\ W \end{array} \right) &=& H \left( \begin{array}{c} x \\ y \\ 1 \end{array} \right)\\ H&=& \left( \begin{array}{ccc} a_{11} & a_{12}&b_1 \\ a_{21} & a_{22}&b_2 \\ 0 & 0 & 1 \end{array} \right) \\ x^{\;\prime}&=&\frac{X}{W}\\ y^{\;\prime}&=&\frac{Y}{W} \end{eqnarray*}

これを同次座標表現と呼ぶ。考えている空間を1次元足した空間に拡張することで行列を正方行列とすることができ、式変形が容易になる。
式(5)で記述できる変換は以下の通りである。

  1. 回転:例えば、\theta回転の変換は

    (6)    \begin{equation*} H&=& \left( \begin{array}{ccc} \cos{\theta} & -\sin{\theta} & 0\\ \sin{\theta} & \cos{\theta} & 0\\ 0 & 0 & 1 \end{array} \right) \end{equation*}

    で実現できる。

  2. 縮小・拡大:例えば、x軸方向にs倍、y軸方向にt倍する変換は

    (7)    \begin{equation*} H&=& \left( \begin{array}{ccc} s & 0 & 0\\ 0 & t & 0\\ 0 & 0 & 1 \end{array} \right) \end{equation*}

    で実現できる。

  3. 平行移動:例えば、x軸方向にay軸方向にbだけ移動する変換は

    (8)    \begin{equation*} H&=& \left( \begin{array}{ccc} 0 & 0 & a\\ 0 & 0 & b\\ 0 & 0 & 1 \end{array} \right) \end{equation*}

    で実現できる。

  4. せん断:例えば、水平方向のせん断は

    (9)    \begin{equation*} H&=& \left( \begin{array}{ccc} 1 & m & 0\\ 0 & 1 & 0\\ 0 & 0 & 1 \end{array} \right) \end{equation*}

    で実現できる。

  5. 反転:例えば、x軸についての反転は

    (10)    \begin{equation*} H&=& \left( \begin{array}{ccc} 1 & 0 & 0\\ 0 & -1 & 0\\ 0 & 0 & 1 \end{array} \right) \end{equation*}

    で実現できる。

これらを組み合わせた変換は、行列の掛け算をすれば良い。上の実例から分かる通り、平行な辺の組みは平行なまま変換されるのがAffine変換である。

Homography変換

変換(5)を拡張して

(11)    \begin{eqnarray*} \left( \begin{array}{c} X\\ Y\\ W \end{array} \right) &=& H \left( \begin{array}{c} x \\ y \\ 1 \end{array} \right)\\ H&=& \left( \begin{array}{ccc} a_{11} & a_{12}& a_{13} \\ a_{21} & a_{22}& a_{23} \\ a_{31} & a_{32}& a_{33} \end{array} \right) \\ x^{\;\prime}&=&\frac{X}{W}\\ y^{\;\prime}&=&\frac{Y}{W} \end{eqnarray*}

を考える。パラメータの数は9である。ここで、行列の全要素に同じ数sをかけた変換を考える。このとき変換後のベクトルは

(12)    \begin{eqnarray*} x^{\;\prime}&=&\frac{sX}{sW}=\frac{X}{W}\\ y^{\;\prime}&=&\frac{sY}{sW}=\frac{Y}{W} \end{eqnarray*}

となる。すなわち、式(11)の変換には定数倍だけの不定性がある。この不定性を取り除くため全要素を、例えばa_{33}で割り、改めて成分を書き直す。

(13)    \begin{equation*} \left( \begin{array}{ccc} a_{11} & a_{12}& a_{13} \\ a_{21} & a_{22}& a_{23} \\ a_{31} & a_{32}& 1 \end{array} \right) \end{equation*}

パラメータ数は8となるので、既知の点の組みが4つあれば上の行列を一意に決めることができる。変換(11)をHomography変換と呼ぶ。Homography変換は、Affine変換で実現できる全ての変換だけでなく、平行な辺の組みを平行でない辺の組みに変換することもできる。例えば

(14)    \begin{equation*} H&=& \left( \begin{array}{ccc} 1 & 0& 0 \\ 0 & 1/2& 0 \\ 0 & -1/2& 1 \end{array} \right) \end{equation*}

は、(0,0),(1,0),(1,1),(0,1)を頂点とする長方形を、(0,0),(1,0),(1,2),(0,1)を頂点とする台形に変換することができる(下図参照)。

OpenCVのコード

OpenCVを用いたHomography変換のサンプルコードを以下に示す。

適用結果は以下の通り。

左側の額縁の頂点①②③④が右側の額縁の頂点①②③④となるように変換した例である。

まとめ

今回は、Affine変換と、それを拡張したHomography変換を紹介した。ここでは、Homography変換のOpenCVによる実装例だけを示したが、Affine変換も同様に実装できる。OpenCVを使えば、メジャーなアルゴリズムを理論的背景を知ることなく使うことができるが、時には立ち止まって背景を見ることも必要である。

Kumada Seiya

Kumada Seiya

仕事であろうとなかろうと勉強し続ける、その結果”中身”を知ったエンジニアになれる

最近の記事

  • 関連記事
  • おすすめ記事
  • 特集記事

アーカイブ

カテゴリー

PAGE TOP