台形歪みの補正や、写真一部を切り取り、ゆがみを補正したいのですが
Graphics32のTProjectiveTransformationcで実験しています。
TProjectiveTransformationではSrcRect四角範囲、X0〜X3 Y0〜Y3に変換後形
状を入れて、投射変換しますが、変換後の画像から、四角に直すのはどの様に
したら宜しいでしょうか?
現在変換元(歪んだ画像の)最大の方形を切り出し、X0〜X3 Y0〜Y3のパラメ
ータの計算方法で悩んでいます、知恵を貸していただけないでしょうか?
射影変換の一般式は
xd = a*xs +b*ys +c*ys*xs
yd = d*xs +e*ys +f*ys*xs
a,b,c,d,e,f が求まればよい。
(xd1,yd1)->(xs1,ys1)
(xd2,yd2)->(xs2,ys2)
(xd3,yd3)->(xs3,ys3)
と3点は必ず決定していますから未知数6個は求まります。
※xd0,yd0,xs0,ys0 は原点で代用し全てゼロ。
一応求めておきました。
a = (xd2* xs1* ys1* ys3 - xd3* xs1* ys1* ys2 - xd1* xs2* ys2* ys3 + xd3* xs2* ys1* ys2 + xd1* xs3* ys2* ys3 - xd2* ys1* xs3* ys3) / (xs1* xs2* ys1* ys3 - xs1* ys1* xs3* ys2 - xs1* xs2* ys2* ys3 + xs2* ys1* xs3* ys2 + xs1* xs3* ys2* ys3 - xs2* ys1* xs3* ys3)
b = (xd3* xs1* xs2* ys1 - xd2* xs1* ys1* xs3 + xd1* xs2* xs3* ys2 - xd3* xs1* xs2* ys2 - xd1* xs2* xs3* ys3 + xd2* xs1* xs3* ys3) / (xs1* xs2* ys1* ys3 - xs1* ys1* xs3* ys2 - xs1* xs2* ys2* ys3 + xs2* ys1* xs3* ys2 + xs1* xs3* ys2* ys3 - xs2* ys1* xs3* ys3)
c = (xd1* xs2* ys3 - xd1* xs3* ys2 - xd2* xs1* ys3 + xd2* ys1* xs3 + xd3* xs1* ys2 - xd3* xs2* ys1) / (xs1* xs2* ys1* ys3 - xs1* ys1* xs3* ys2 - xs1* xs2* ys2* ys3 + xs2* ys1* xs3* ys2 + xs1* xs3* ys2* ys3 - xs2* ys1* xs3* ys3)
d = (yd2* xs1* ys1* ys3 - yd3* xs1* ys1* ys2 - yd1* xs2* ys2* ys3 + yd3* xs2* ys1* ys2 + yd1* xs3* ys2* ys3 - yd2* ys1* xs3* ys3) / (xs1* xs2* ys1* ys3 - xs1* ys1* xs3* ys2 - xs1* xs2* ys2* ys3 + xs2* ys1* xs3* ys2 + xs1* xs3* ys2* ys3 - xs2* ys1* xs3* ys3)
e = (yd3* xs1* xs2* ys1 - yd2* xs1* ys1* xs3 + yd1* xs2* xs3* ys2 - yd3* xs1* xs2* ys2 - yd1* xs2* xs3* ys3 + yd2* xs1* xs3* ys3) / (xs1* xs2* ys1* ys3 - xs1* ys1* xs3* ys2 - xs1* xs2* ys2* ys3 + xs2* ys1* xs3* ys2 + xs1* xs3* ys2* ys3 - xs2* ys1* xs3* ys3)
f = (yd1* xs2* ys3 - yd1* xs3* ys2 - yd2* xs1* ys3 + yd2* ys1* xs3 + yd3* xs1* ys2 - yd3* xs2* ys1) / (xs1* xs2* ys1* ys3 - xs1* ys1* xs3* ys2 - xs1* xs2* ys2* ys3 + xs2* ys1* xs3* ys2 + xs1* xs3* ys2* ys3 - xs2* ys1* xs3* ys3)
ああシンド
よくみると分母は皆同じではないか
xs1* xs2* ys1* ys3 - xs1* ys1* xs3* ys2 - xs1* xs2* ys2* ys3 + xs2* ys1* xs3* ys2 + xs1* xs3* ys2* ys3 - xs2* ys1* xs3* ys3
ウォレスさん、大変ありがとうございます。
書いて頂いたのは、自前で投射変換するときの
元絵SrcのXYから、後絵SrcのXYを求める計算式
xd = a*xs +b*ys +c*ys*xs
yd = d*xs +e*ys +f*ys*xs
のa,b,c,d,e,fの定数を計算する式でしょうか?
できれば、TProjectiveTransformationであれば、ディザリング処理等も
してくれますので SrcRect と X0〜X3 Y0〜Y3 パラメータだけで計算で
きれば嬉しいなと思っていました。
理屈で言うと(嘘、感覚的に言うと)
台形が四角にマッピングされるとき、台形を囲む長方形が逆に歪んでマッピングされるわけですが、その4隅がわかればよいわけですよね。
つうことで上記の情報から力技で算出できるんじゃないかと。
こんなのやったことないんで、正解かどうかわかりませんが・・
寧ろ、歪んだ四角を長方形にマッピングするのは自前で実装した方が簡単です。
junkiさんのところに資料がないか探したんですが探しきれませんでした。
ありがとうございます。
提示していただいた、射影変換の一般式からなんとか
求める事が出来ました、ディザリング処理は今後検討
したいと思います。
ツイート | ![]() |