ねこでじ(Nekodigi)

Nekodigi’s diary

学習中の気づきをまとめています。応援よろしくお願いします

【Python】ライブラリなしでPerspective Transformを実装する。

成果物

f:id:Nekodigi:20200311115304p:plain
枠の変形に合わせて自動的に遠近法が計算されています。また、計算順序を逆にするだけで、簡単に逆変換ができるのでBilinear補間なども簡単に行うことができそうです。

仕組み

この大きな行列式を使って、変換前と変換後の四つ角の座標から、比例係数を求めていくような仕組みになっています。比例係数abc...は連立方程式と同じように求めることができ、それを使うと、任意の座標を変換できます。
 \begin{array}{l}
x,yは変換前の位置、X,Yは変換後の位置、それぞれの4つの角の座標を決めて計算する。\\
\begin{bmatrix}
x_{1} & y_{1} & 1 & 0 & 0 & 0 & -x_{1} X_{1} & -y_{1} X_{1}\\
x_{2} & y_{2} & 1 & 0 & 0 & 0 & -x_{2} X_{2} & -y_{2} X_{2}\\
x_{3} & y_{3} & 1 & 0 & 0 & 0 & -x_{3} X_{3} & -y_{3} X_{3}\\
x_{4} & y_{4} & 1 & 0 & 0 & 0 & -x_{4} X_{4} & -y_{4} X_{4}\\
0 & 0 & 0 & x_{1} & y_{1} & 1 & -x_{1} Y_{1} & -y_{1} Y_{1}\\
0 & 0 & 0 & x_{2} & y_{2} & 1 & -x_{2} Y_{2} & -y_{2} Y_{2}\\
0 & 0 & 0 & x_{3} & y_{3} & 1 & -x_{3} Y_{3} & -y_{3} Y_{3}\\
0 & 0 & 0 & x_{4} & y_{4} & 1 & -x_{4} Y_{4} & -y_{4} Y_{4}
\end{bmatrix} \cdot \begin{bmatrix}
a\\
b\\
c\\
d\\
e\\
f\\
g\\
h
\end{bmatrix} =\begin{bmatrix}
X_{1}\\
X_{2}\\
X_{3}\\
X_{4}\\
Y_{1}\\
Y_{2}\\
Y_{3}\\
Y_{4}
\end{bmatrix}\\
a,b,c...を連立方程式を解くように求めると、任意のx,yの座標からX,Yが計算できる。\\
X=\frac{ax+by+c}{gx+hy+1} ,Y=\frac{dx+ey+f}{gx+hy+1}
\end{array}
こちらのサイトをもとにしています。
www.corrmap.com

コード

今回は、行列計算の簡略化のためPythonで実装しています。連立方程式を解くプログラムは、すでにProcessingで作っているので、今後実装していく予定です。