2次元の座標変換 (2D coordinate transformation) |
2018-06-09 - 2018-07-13 (update) |
|
|
2次元の座標変換についてまとめます.
*2次元の座標変換とは
元々の2次元座標上の位置{$(x, y)$}を,何らかの変換式(或いはテーブル)に基づいて新しい位置{$(x', y')$}に変換する処理です.画像を例に説明すると図1の様に画像の位置や角度を変換するときに利用されます.コンピュータビジョンの分野ではいろいろな変換式が利用されていますが,簡単なものから順に解説していきたいと思います.
[img:t3f5]
{{small:図1 2次元画像の座標変換の例}}
*線形変換
行列の掛け算を使った変換を線形変換と呼びます.これを使えば,位置や角度,スケールなどの変換が可能です.主に表1に示す種類があります.
[img:pgdy]
{{small:表1 線形変換の行列の例 出典[1]}}
{{small:[1] R Szeliski, “Computer vision:algorithms and applications”, Springer Science & Business Media, 2011.
[link:http://szeliski.org/Book/] }}
**位置の変換 (translation)
[img:9nwv]
{{small:図2 位置の変換}}
位置の変換は単純に足し算引き算で表現できます.ただし,後で示す理由から同次座標系を使って,行列の掛け算で表現する場合が多いと思います.{{small:理由は後で説明します}}
{$$\begin{align*}
\begin{bmatrix} x'\\y' \end{bmatrix} = \begin{bmatrix} x\\y \end{bmatrix} + t
\end{align*}$$}
ここで,{$t$}は2行1列の行列です.{$\begin{align*}t = \begin{bmatrix} t_x\\t_y \end{bmatrix}\end{align*}$}
同次座標系表現では,次の式で表現します.
{$$
\begin{bmatrix} x'\\y'\\1 \end{bmatrix}
=\begin{bmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x\\y\\1 \end{bmatrix}
$$}
**角度の変換 (rotation)
[img:3btc]
{{small:図3 角度の変換}}
角度の変換は三角関数を含む行列を利用して表現できます.詳しくは[link:回転]を参照してください.
{$$\begin{align*}
\begin{bmatrix} x'\\y' \end{bmatrix} &= R \begin{bmatrix} x\\y \end{bmatrix}
=\begin{bmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{bmatrix}
\begin{bmatrix} x\\y \end{bmatrix}
\end{align*}$$}
同次座標系表現では,次の式で表現します.
{$$
\begin{bmatrix} x'\\y'\\1 \end{bmatrix}
=\begin{bmatrix} \cos\theta & -\sin\theta & 0\\ \sin\theta & \cos\theta & 0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x\\y\\1 \end{bmatrix}
$$}
**位置と角度の変換 (rigid transform)
[img:hrx9]
{{small:図4 位置と角度の変換}}
位置と角度の変換を組み合わせた変換です.パラメータ数は3つ({$t_x, t_y, \theta$})です.なお,位置や角度の変換は,注目する物体の形が崩れるわけではないため,剛体変換と呼ぶ場合もあります.
{$$\begin{align*}
\begin{bmatrix} x'\\y' \end{bmatrix}
=\begin{bmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{bmatrix}\begin{bmatrix} x\\y \end{bmatrix} + t
\end{align*}$$}
同次座標系表現では,次の式で表現します.
{$$
\begin{bmatrix} x'\\y'\\1 \end{bmatrix}
=\begin{bmatrix}
\cos\theta & -\sin\theta & t_x\\ \sin\theta & \cos\theta
& t_y \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x\\y\\1
\end{bmatrix}
$$}
**位置と角度とスケールの変換 (similarity transform)
[img:5d7x]
{{small:図5 位置と角度とスケールの変換}}
位置と角度とスケールを組み合わせた変換です.パラメータ数は4つ({$t_x, t_y, \theta, s$})です.スケールの変化を含めるので,相似変換と呼ぶ場合もあります.
{$$\begin{align*}
\begin{bmatrix} x'\\y' \end{bmatrix}
=s\begin{bmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{bmatrix}\begin{bmatrix} x\\y \end{bmatrix} + t
\end{align*}$$}
同次座標系表現では,次の式で表現します.
{$$
\begin{bmatrix} x'\\y'\\1 \end{bmatrix}
=\begin{bmatrix}
s\cos\theta & -s\sin\theta & t_x\\ s\sin\theta & s\cos\theta & t_y \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x\\y\\1
\end{bmatrix}
$$}
**アフィン変換 (affine transform)
[img:3lkd]
{{small:図6 アフィン変換}}
2x3の行列の各要素を自由に設定して表現する変換です.パラメータ数は6つです.画像を平行四辺形に歪める変形も表現できます.
{$$\begin{align*}
\begin{bmatrix} x'\\y' \end{bmatrix}
=\begin{bmatrix} A_{11} & A_{12} & A_{13} \\ A_{21} & A_{22} & A_{23} \end{bmatrix}\begin{bmatrix} x\\y\\1
\end{bmatrix}
\end{align*}$$}
同次座標系表現では,次の式で表現します.
{$$
\begin{bmatrix} x'\\y'\\1 \end{bmatrix}
=\begin{bmatrix} A_{11} & A_{12} & A_{13} \\ A_{21} & A_{22} & A_{23} \\ 0 & 0 & 1 \end{bmatrix}
\begin{bmatrix} x\\y\\1
\end{bmatrix}
$$}
ちなみに,図7のように平行四辺形の程度だけ変換したい場合は,{$A_{12}$}や{$A_{21}$}の数値を調整することになります.具体的に図7はX軸の方向にスライドさせた平行四辺形ですので,{$A_{12}$}に適当な数値を入れることになります.{{small:{$A_{12}$}や{$A_{21}$}はスキューの要素と呼ぶ場合があります.}}
{$$\begin{align*}
\begin{bmatrix} x'\\y' \end{bmatrix}
=\begin{bmatrix} 1 & A_{12} & 0 \\ 0 & 1 & 0 \end{bmatrix}\begin{bmatrix} x\\y\\1
\end{bmatrix}
\end{align*}$$}
[img:xvgt]
{{small:図7 平行四辺形に変換}}
**ホモグラフィ変換 (homography transform)
[img:b5j7]
{{small:図6 ホモグラフィ変換}}
射影変換と呼ぶ場合も有ります.3x3の行列の各要素を自由に設定して表現する変換です.パラメータ数は9つです.ただし,行列を定数倍しても同じ変換になるため,潜在的にはパラメータは8つで表現できます.アフィン変換と比べると,部位毎のスケールの違いを調整できるため,立体感のある変換が可能になります.
{$$
s\begin{bmatrix} x'\\y'\\1 \end{bmatrix}
=\begin{bmatrix} H_{11} & H_{12} & H_{13} \\ H_{21} & H_{22} & H_{23} \\ H_{31} & H_{32} & H_{33} \end{bmatrix}
\begin{bmatrix} x\\y\\1
\end{bmatrix}
$$}
なお左辺の{$s$}は,下記のように式を展開すると消ます.
{$$
x' = \frac{H_{11}x + H_{12}y + H_{13}}{H_{31}x + H_{32}y + H_{33}} \\
y' = \frac{H_{21}x + H_{22}y + H_{23}}{H_{31}x + H_{32}y + H_{33}}
$$}
**同次座標系の恩恵
無理に同次座標系で考える必要はありませんが,いくつか便利な特徴があります.
***掛け算だけで表現できる
複数の変換を組み合わせる際に有効です.例えば,何らかの線形変換を行う行列が2つあったとします.それぞれ3x3の行列で,{$T_1$},{$T_2$}とします.足し算を含めると少しややこしくなりますが,掛け算だけであれば単に左から掛けるだけで表現できてシンプルです.また当然ですが1つの行列{$T = T_1 T_2$}に置き換えて計算することもできます.
{$$
s\begin{bmatrix} x'\\y'\\1 \end{bmatrix}
= T_1 T_2\begin{bmatrix} x\\y\\1 \end{bmatrix}= T\begin{bmatrix} x\\y\\1 \end{bmatrix}
$$}
***逆変換は逆行列
{$(x', y')$}から{$(x, y)$}に向かう変換を考えたいとします.正方行列の掛け算で表現する同次座標系であれば,逆変換は単に逆行列を計算するだけで済みます.
{$$
\begin{bmatrix} x\\y\\1 \end{bmatrix} = sT^{-1}\begin{bmatrix} x'\\y'\\1 \end{bmatrix}
$$}
*非線形変換
行列の掛け算で表現できない変換を非線形変換と呼びます.線形変換では表現できない複雑な変換を表現したいときに,考える必要があります.
例えば,コンピュータビジョンの分野で良く使うレンズ歪みの変換は次の式で表現されます.{{small:(レンズ歪みについては[link:カメラモデル]を参考にしてください)}}
{$$\begin{align*}
x' &= x (1+k_1 r^2 + k_2 r^4 + k_3 r^6) + (2 p_1 xy + p_2 (2 x^2 + r^2)) \\
y' &= y (1+k_1 r^2 + k_2 r^4 + k_3 r^6) + (p_1 (2 y^2 + r^2) + 2 p_2 xy)
\end{align*}$$}
>> ご意見・ご質問など お気軽にご連絡ください.info