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

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

アフィン変換とは

本ページの内容は以下動画で解説しています。

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

■入力画像(左)と出力画像(右)※アフィン変換で回転させた例

アフィン変換の式

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*}

関連ページ

PythonとOpenCVを用いてアフィン変換を実装する方法について以下ページで解説しています。

【Python/OpenCV】アフィン変換で画像の回転(cv2.warpAffine)
Python版OpenCVとNumPyを用いてアフィン変換を実装し、画像を回転させる方法をソースコード付きで解説します。

PythonとOpenCVを用いた画像処理全般については以下ページで解説しています。

【Python版OpenCV入門】画像処理の基礎〜応用例までサンプルコード付きで徹底解説
Python版OpenCVで画像処理プログラミングを行う方法を入門者向けにソースコード付きで解説するページです。

他の画像処理アルゴリズムについては、以下ページでまとめています。

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

コメント