Pynote

Python、機械学習、画像処理について

OpenCV - 画像に適用するアフィン変換について

標準座標系と画像座標系

数学では2次元の場合、通常は右方向に x 軸、上方向に y 軸をとる標準座標系 (standard coordinate system) が用いられる。
一方、画像処理では、画像の左上を原点とし、右方向に x 軸、下方向に y 軸をとる画像座標系 (image coordinate system) が用いられる。

標準座標系での変換行列は画像座標系では異なる場合があるので注意する。
 A が標準座標系での変換行列とする。

標準座標系の基底 \boldsymbol{e}_1 = (1, 0)^T, \boldsymbol{e}_2 = (0, 1)^T を画像座標系の基底 \boldsymbol{e}'_1 = (1, 0)^T, \boldsymbol{e}'_2 = (0, -1)^T に変換する基底変換行列は

 \displaystyle
P = \begin{pmatrix}
1 & 0 \\
0 & -1 \\
\end{pmatrix}

であるから、P^{-1} = P に注意すると、A の画像座標系での変換行列は PAP となる。

例:
標準座標系で原点を中心に反時計回りに \theta だけ回転する行列は以下である。

 \displaystyle
A = \begin{pmatrix}
\cos \theta & -\sin \theta \\
\sin \theta & \cos \theta \\
\end{pmatrix}

このとき、画像座標系での変換行列は

 \displaystyle
P^{-1}AP = \begin{pmatrix}
\cos \theta & \sin \theta \\
 \sin (-\theta) & \cos \theta \\
\end{pmatrix}

A_{21} が変わっていることに注意する。

主な変換一覧

概要 標準座標系 画像座標系
x 軸方向に s_xy 軸方向に x_y だけ拡大縮小 (scaling) \begin{pmatrix}
s_x & 0 & 0 \\
0 & s_y & 0 \\
0 & 0 & 1 \\
\end{pmatrix} \begin{pmatrix}
s_x & 0 & 0 \\
0 & s_y & 0 \\
0 & 0 & 1 \\
\end{pmatrix}
原点を中心に反時計回りに \theta だけ回転 (rotation) \begin{pmatrix}
\cos \theta & -\sin \theta & 0 \\
\sin \theta & \cos \theta & 0 \\
0 & 0 & 1 \\
\end{pmatrix} \begin{pmatrix}
\cos \theta & \sin \theta & 0 \\
\sin (-\theta) & \cos \theta & 0 \\
0 & 0 & 1 \\
\end{pmatrix}
x 軸方向に ay 軸方向に [tex:b だけ平行移動 (translation) \begin{pmatrix}
1 & 0 & a \\
0 & 1 & b \\
0 & 0 & 1 \\
\end{pmatrix} \begin{pmatrix}
1 & 0 & a \\
0 & 1 & b \\
0 & 0 & 1 \\
\end{pmatrix}
水平せん断 (sheer) \begin{pmatrix}
1 & \lambda & 0 \\
0 & 1 & 0 \\
0 & 0 & 1 \\
\end{pmatrix} \begin{pmatrix}
1 & -\lambda & 0 \\
0 & 1 & 0 \\
0 & 0 & 1 \\
\end{pmatrix}
鉛直せん断 (sheer) \begin{pmatrix}
1 & 0 & 0 \\
\lambda & 1 & 0 \\
0 & 0 & 1 \\
\end{pmatrix} \begin{pmatrix}
1 & 0 & 0 \\
 -\lambda & 1 & 0 \\
0 & 0 & 1 \\
\end{pmatrix}
x 軸に関する反転 (refraction) \begin{pmatrix}
 -1 & 0 & 0 \\
0 & 1 & 0 \\
0 & 0 & 1 \\
\end{pmatrix} \begin{pmatrix}
 -1 & 0 & 0 \\
0 & 1 & 0 \\
0 & 0 & 1 \\
\end{pmatrix}
y 軸に関する反転 (refraction) \begin{pmatrix}
1 & 0 & 0 \\
0 & -1 & 0 \\
0 & 0 & 1 \\
\end{pmatrix} \begin{pmatrix}
1 & 0 & 0 \\
0 & -1 & 0 \\
0 & 0 & 1 \\
\end{pmatrix}

変換の例

拡大縮小 (scaling)


回転 (rotation)


平行移動


反転

x 軸に関する反転

y 軸に関する反転


せん断 (sheer)

水平せん断

鉛直せん断


画像にアフィン変換を適用する流れ

1. 変換後の出力画像における各画素の位置の変換前の位置を計算する。

2. 1で求めた変換前の各位置の画素値を補完法で求め、それを出力画像の画素値とする。