デジタル・デザイン・ラボラトリーな日々

アラフィフプログラマーが数学と物理と英語を基礎からやり直す。https://qiita.com/yaju

射影変換(ホモグラフィ)について理解してみる 射影変換式について

昔、定期的に購読していた「C MAGAZINE」の大半は処分したんですが、処分する際に数冊程は内容を見て残しておいたのです。

C MAGAZINE 2005年1月号は、特集2が「物理運動をシュミレーションしよう」ってことでたぶん残したんですが、この本を何気に見ていたら「グラフィック処理技法 非線形関数を持用いたさまざまな変形処理   昌達 K'z」があって、⑤遠近変形に射影変換式の記載がありました。

平面射影変換のサイトにある変換式と表現が違いますが内容は同じです。

x=(AX+BY+C)/(GX+HY+1)

y=(DX+EY+F)/(GX+HY+1)

この変換式がどうやって求まるのかの説明が書かれていました。

説明の前に3次元ベクトルの1次変換は下記のようになっていることを提示しておきます。
x=AX+BY+CZ
y=DX+EY+FZ
z=GX+HY+IZ

 

遠近法は絵画などで一般的に利用されますが、基本は視点から遠い部分を小さくすることで三次元の物体を二次元上で表現します。数学的にこれを説明すると、三次元の座標(X,Y,Z)を二次元上の座標(x,y)に投影する際、Zに反比例してXとYが小さくなるようにすることで二次元の座標に変換することといえます。

これを式に表すと、

x=X/Z

y=Y/Z

となります。ここで、(X,Y,Z)が平面上にあるとすると、

Z=GX+HY+I

という関係が成り立つので、これを上式に代入すると、

x=X/(GX+HY+I)

y=Y/(GX+HY+I)

という式が得られます。まあ、見る位置によって座標は回転、拡大縮小することが考えられるので、X,Yについてアフィン変換を施し、

x=(AX+BY+C)/(GX+HY+I)

y=(DX+EY+F)/(GX+HY+I)

という式を得ることができます。これが遠近変形における変形の式となります。ただし、この式ではA~Iの比率が同じであれば同じ変形になります。ですから同じ変形を示すパラメータが無数に存在することになります。これを防ぐためには例えば、I=1とし、

x=(AX+BY+C)/(GX+HY+1)

y=(DX+EY+F)/(GX+HY+1)

とすることで、組み合わせをただ1つにすることができます(ここではI=1としましたが、この数値は何でもかまいません)

しかし、射影変換式のままだと分数を含んでしまうので、分母を払い一次多項式に展開する。

分母を払うので分母を左項に移動します。

x(GX+HY+1)=(AX+BY+C)

y(GX+HY+1)=(DX+EY+F)

左項を展開します。

GxX+HxY+x=AX+BY+C

GyX+HyY+y=DX+EY+F

左項をxyを残し、右項に移動します。

x = AX + BY + C - GxX - HxY
y = DX + EY + F - GyX - HyY

この多項式に各点(X,Y,x,y)を代入し、連立方程式を解く上で行列にする。 

f:id:Yaju3D:20140801020025j:plain

 

スポンサーリンク