Graphics32での台形歪みの補正方法は?

解決


あひる  2009-11-14 00:24:23  No: 36174

台形歪みの補正や、写真一部を切り取り、ゆがみを補正したいのですが
Graphics32のTProjectiveTransformationcで実験しています。

TProjectiveTransformationではSrcRect四角範囲、X0〜X3  Y0〜Y3に変換後形
状を入れて、投射変換しますが、変換後の画像から、四角に直すのはどの様に
したら宜しいでしょうか?

現在変換元(歪んだ画像の)最大の方形を切り出し、X0〜X3  Y0〜Y3のパラメ
ータの計算方法で悩んでいます、知恵を貸していただけないでしょうか?

http://graphics32.org/documentation/Docs/Units/GR32_Transforms/Classes/TProjectiveTransformation/_Body.htm


ウォレス  2009-11-16 23:01:40  No: 36175

射影変換の一般式は
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)
 
ああシンド


ウォレス  2009-11-16 23:13:47  No: 36176

よくみると分母は皆同じではないか

xs1* xs2* ys1* ys3 - xs1* ys1* xs3* ys2 - xs1* xs2* ys2* ys3 + xs2* ys1* xs3* ys2 + xs1* xs3* ys2* ys3 - xs2* ys1* xs3* ys3


あひる  2009-11-18 09:28:10  No: 36177

ウォレスさん、大変ありがとうございます。

書いて頂いたのは、自前で投射変換するときの
元絵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 パラメータだけで計算で
きれば嬉しいなと思っていました。

http://graphics32.org/documentation/Docs/Units/GR32_Transforms/Classes/TProjectiveTransformation/_Body.htm
の絵の逆変換です。


ウォレス  2009-11-18 19:20:48  No: 36178

理屈で言うと(嘘、感覚的に言うと)
台形が四角にマッピングされるとき、台形を囲む長方形が逆に歪んでマッピングされるわけですが、その4隅がわかればよいわけですよね。

つうことで上記の情報から力技で算出できるんじゃないかと。
こんなのやったことないんで、正解かどうかわかりませんが・・

寧ろ、歪んだ四角を長方形にマッピングするのは自前で実装した方が簡単です。

junkiさんのところに資料がないか探したんですが探しきれませんでした。


あひる  2009-11-30 21:02:06  No: 36179

ありがとうございます。
提示していただいた、射影変換の一般式からなんとか
求める事が出来ました、ディザリング処理は今後検討
したいと思います。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加