画像変形ソフト

http://www.kusastro.kyoto-u.ac.jp/~iwamuro/Kyoto3m/rawwarp.html

岩室 史英 (京大宇物)


●目的

拡張フーコーテストの画像解析や分光器の画像解析の際に、任意のベクトル場に沿って画像を変形させる必要が出てくる。いい方法がないかあれこれ調べてみたが、高度な画像解析に耐えられる良い物がなかったので、自作してみた。やってみてわかったが、任意の四角をグリッドで切り分けるのは場合分けが多くてかなり大変だった。

●考え方

任意のベクトル場に沿って画像を変形させる場合、まず考えるのが以下のようなイメージだが、実際のデータを考えるとちょっとおかしい事に気がつく。ベクトル場を与えるデータも、通常は同じフォーマットの2枚の画像として与えられ、ベクトルは1つの座標格子に対して1つしか与えられていないからだ。即ち、ベクトルの起点はその画素の代表点である画素中心でないといけない。

この場合、注目する画素周辺の8つの画素のベクトル情報も必要になる。変換後の画素形状は、周辺8つの画素中心までの中間点を結んでできる八角形として定義する事ができる。変換先での座標格子でこの八角形を切り分ける必要があるが、座標格子よりも小さい構造にしてから切り分ける方が分かりやすいので、1/4 領域毎に切り分ける事を考える。この領域が座標格子よりも大きくなる場合は、この四角形を更に細分化して計算することで大きく拡大される場合や長く引き伸ばされる場合にも対応できる。

上図右では、黄色の領域が青の座標格子によって4つの領域に分割されている。格子の頂点を右上から左回りに 1,2,3,4 と定義し、これらが座標グリッドに対しどのように分かれて配置されているかで場合分けする。

  • 1234
    これは簡単

  • 123-4, 124-3, 134-2, 234-1
    別れた1つが3点の集団に対しどの象限に来るかでそれぞれ3通りに分かれる。対角に来る場合、格子点が四角に含まれる場合と上側外と下側外にある場合の3つに更に細分化する。

  • 12-34, 14-23
    片方のグループがもう片方のグループに対しどの象限に来るかでそれぞれ6通りに分かれ、対角に分かれる場合は格子点が四角の中に含まれるか上側外か下側外かで更に3通りに分かれる(対角配置や横並び配置はまず出てこないと思うが...)

  • 12-3-4, 13-2-4, 14-2-3, 23-1-4, 24-1-3, 34-1-2
    2点の集団が入る象限に2つの可能性があり、残り1点ずつの配置が3通りあるので6通り、それぞれで格子点が四角の内部にある場合と無い場合で更に2つに細分化する。

  • 1-2-3-4
    これも簡単

上図右の状態は、23-1-4 でこのパターンとしては最も起こりやすい状態となっている。もしも、上記のどれにも入らない場合が現れた場合は、定義されていない形状としてエラーが出るので、その都度組み込んでいけば問題ない。

次に、格子で切り取られる部分の計算ツールの準備。

  • 三角切り取り1

     方向により2通り

  • 三角切り取り2

     これはどの方向でも同じ

  • 四角切り取り1

     これもどの方向でも同じ

  • 四角切り取り2

     方向により4通り

五角形や場合によっては六角形まで現れるが、可能な限り上記の組み合わせで計算を行い、どうしても無理の場合にのみ全体から引き算して計算する。切り分けられた面積の和が元の面積と一致している事、面積が Inf だったり負になっていない事もその都度確認し、違っていればエラーを出す。これを実装してデバッグするのが大変で、何とか終了した。

●使用例

このソフトのパワーを確認するため、分光器などでよくある3次の歪曲+台形変形+弓反り変形を組み合わせて、グリッドパターンと全面1の画像を変換してみたのが以下。総カウントが保存されている事も確認済み。KOOLS の画像解析とかにも使えると思う。

ソースはこちら: rawwarp.c

計算時の分割数を増やすことで以下程度の変形までは対応できるが、これ以上歪めると定義されていない頂点配置が現れるため新たな頂点配置パターンの定義が必要。とりあえずは面倒なので、必要が出たら対応することにする。


KOOLS の画像解析に応用したものがこちら


iwamuro@kusastro.kyoto-u.ac.jp