【画像処理】アフィン変換による回転の原理・計算式

この記事では、画像を拡大・縮小・回転させる「アフィン変換」の原理や計算方法についてまとめました。

アフィン変換とは

アフィン変換とは、平行移動と線形変換を組み合わせた変換です。
つまり、アフィン変換で画像の拡大・縮小、回転、移動などを行うことができます。

■入力画像(左)と出力画像(右)

アフィン変換の式

2次元平面の場合、線形変換は元座標(x, y)2\times 2の行列を掛けることで表現できます。
平行移動は2次元ベクトルを[t_x, t_y]^T加算することで表現できます。

(1)   \begin{eqnarray*} \left[ \begin{array}{ccccc} x' \\ y' \\ \end{array}\right]=\left[ \begin{array}{ccccc} a & b \\ c & d \\ \end{array} \right] \left[ \begin{array}{ccccc} x \\ y \\ \end{array} \right]+\left[ \begin{array}{ccccc} t_x \\ t_y \\ \end{array} \right] \end{eqnarray*}

ここで、(x',y')は変換後の座標です。
次のように3 \times 3の行列を用いて、線形変換と平行移動の計算を1つの乗算にまとめることもできます。

(2)   \begin{eqnarray*} \left[ \begin{array}{ccccc} x' \\ y' \\ 1 \\ \end{array}\right]=\left[ \begin{array}{ccccc} a & b & t_x \\ c & d & t_y \\ 0 & 0 & 1 \\ \end{array} \right] \left[ \begin{array}{ccccc} x \\ y \\ 1 \\ \end{array} \right] \end{eqnarray*}

回転の計算式

アフィン変換での回転だけを考えます。
原点(0, 0)で点(x, y)を角度\thetaだけ回転した後の点(x', y')は次の式で計算できます。

(3)   \begin{eqnarray*} \left[ \begin{array}{ccccc} x' \\ y' \\ \end{array}\right]=\left[ \begin{array}{ccccc} cos\theta & -sin\theta \\ sin\theta & cos\theta \\ \end{array} \right] \left[ \begin{array}{ccccc} x \\ y \\ \end{array} \right] \end{eqnarray*}

さらに展開すると次の式になります。

(4)   \begin{eqnarray*} x'=xcos\theta - ysin\theta \\ y'=xsin\theta + ycos\theta \end{eqnarray*}

画像の回転

画像を回転する場合、原点(0, 0)ではなく画像の中心周りに回転させるのが一般的です。
そのため、画像の回転に利用する際は、以下の2点について考慮する必要があります。

説明
画像の中心を原点(0, 0)にするため、座標x, yから入力画像の幅w/2と高さh/2を引きます。
変換後の座標x', y'は、原点を(0, 0)でなく出力画像の中心にするため、出力画像の幅w'/2と高さh'/2を加えます。

①②を考慮したとき、アフィン変換による回転の計算式は次のようになります。

(5)   \begin{eqnarray*} x'=(x-w/2)cos\theta - (y-h/2)sin\theta + w'/2 \\ y'=(x-w/2)sin\theta + (y-h/2)cos\theta + h'/2 \end{eqnarray*}

【画像処理入門】アルゴリズム&プログラミング
この記事では、画像処理における基本的なアルゴリズムとその実装例(プログラム)についてまとめました。

コメント