アフィン変換を使った特徴点マッチングで雑すぎるコラ画像を作る
July 14, 2022
はじめに
特徴点マッチングにおいてのアフィン行列を求める記事です。この記事では特徴点を手動で決めることとします。
こんな感じで2枚の画像の特徴点をクリックして特徴点を指定して、それに合うように片方の画像をアフィン変換によって変形させて重ねることが目的です。
特徴点マッチング
アフィン行列
画像の各座標を変換させる行列計算
⎝⎛x′y′1⎠⎞=⎝⎛ac0bd0txty1⎠⎞⎝⎛xy1⎠⎞
の
A=⎝⎛ac0bd0txty1⎠⎞
の部分がアフィン行列。
この行列だけで画像の回転、拡大、縮小、移動、反転、せん断を表せる優れもの!!
アフィン変換については以下の記事を参考にさせていただきました。
完全に理解するアフィン変換
行列によるアフィン変換(拡大縮小・回転・剪断・移動) ~Python画像処理の再発明家~
アフィン行列の算出
2つの画像の特徴点がN(N≧3)個あったとき、変換前の画像の特徴点の座標を
(xnyn)
変換後の座標を
(xn′yn′)
としてN個の座標すべてにアフィン変換をする行列式は
⎝⎛x1′y1′1x2′x2′1⋯⋯⋯xN′xN′1⎠⎞=⎝⎛ac0bd0txty1⎠⎞⎝⎛x1y11x2x21⋯⋯⋯xNxN1⎠⎞
で表すことが出来ます。このa,b,c,d,tx,tyの最もらしい値を求めることが目的となります。
ここで1組の変換前後の座標
(xnyn),(xn′yn′)
に対してアフィン変換
⎝⎛xn′yn′1⎠⎞=⎝⎛ac0bd0txty1⎠⎞⎝⎛xnyn1⎠⎞
を展開すると
xn′yn′=axn+byn+tx=cxn+dyn+ty
になります。
w1=⎝⎛abtx⎠⎞,w2=⎝⎛cdty⎠⎞,pn=(xnyn1),pn′=(xn′yn′1)
というようなベクトルを用意すれば
xn′yn′=pnw1=pnw2
と書けます。変換先の座標とアフィン変換による変換後の座標の距離を誤差関数にして、誤差関数が一番小さくなる時の w1 とw2を求めます。
誤 差関数Eを
E=n=1∑N((xn′−pnw1)2+(yn′−pnw2)2)
に設定して、これを行列形式で表すために
x′=⎝⎛x1′⋮xN′⎠⎞,y′=⎝⎛y1′⋮yN′⎠⎞,P=⎝⎛p1⋮pN⎠⎞=⎝⎛x1xNy2⋮yN11⎠⎞
とすれば
E=(x′−Pw1)T(x′−Pw1)+(y′−Pw2)T(y′−Pw2)
と書けます。展開すると
E=(x′T−(Pw1)T)(x′−Pw1)+(y′T−(Pw2)T)(y′−Pw2)=x′Tx′−x′TPw1−(Pw1)Tx′+(Pw1)T(Pw1)+y′Ty′−y′TPw2−(Pw2)Ty′+(Pw2)T(Pw2)=x′Tx′−w1TPTx′−w1TPTx′+w1TPTPw1+y′Ty′−w2TPTy′−w2TPTy′+w2TPTPw2=x′Tx′−2w1TPTx′+w1TPTPw1+y′Ty′−2w2TPTy′+w2TPTPw2
となります。ここでは
x′TPw1x′TPw2=((Pw1)Tx′)T=(w1TPTx′)T=w1TPTx′=((Pw2)Tx′)T=(w2TPTx′)T=w2TPTx′
を用いました。w1TPTx′が1×1行列になることから(w1TPTx′)T=w1TPTx′が成り立ちます。そして、w1、w2で偏微分してEが小さくなる時を求めると
∂w1∂E=−2PTx′+2PTPw12PTPw1w1∂w2∂E=−2PTy′+2PTPw22PTPw2w2