画像モーフィング特論

ワーピングはどのように実現されているか? 適当な変換関数に従って*1先画像の各pixelの色を元画像の(いくつかの)pixelから求める.
「適当な変換関数」では随分と漠然としてるが,ワーピングに使う変換関数は滑らかな全単射でなければならない... とまぁいきなりワーピングを意図した変換関数について考えるのはちょっとギャップが広いので,ここではとりあえず画像の変換の基本について話を進めよう.目指すは画像のaffine変換,すなわち拡大縮小,回転,平行移動,歪ませることだ.これらは実は行列演算という観点から統一的に扱えるので,もっとも単純なものを実装してしまえば後はちょっとした書き換えで済む.で,もっとも単純なもの... ?
先ずx座標のみを変換するものを考えよう.それも「座標の値を2倍にする」というすさまじく単純なものだ.要するに画像を右に引っ張る.右半分ははみ出て消えてしまうだろうからワーピングには使えないが,まぁ今は画像変換の練習だからよいのだ.「途中の画像」は大して意味ないので省く(「1.5倍にする」等と書き換えるだけ).

 12345678 12345678 
1 ■    ■ 1   ■    1
2 ■    ■ 2   ■    2
3 ■    ■ 3   ■    3
4  ■  ■  4     ■  4
5  ■  ■  5     ■  5
6  ■  ■  6     ■  6
7  ■  ■  7     ■  7
8   ■■   8       ■8
 12345678 12345678  

ありゃ,千切れましたね.(x, y)=(2, 1)にある を(4, 1)に持って来てetc... ではこういう悲しい結果になってしまう.

*1:「『元』から『先』へ変換するのだ」という意図を尊重すれば「変換関数の逆関数に従って」と言うべきか.