鏡映とスキュー

CG画像処理

平行移動・拡大縮小・回転 に加えてよく使われる2つの変換、鏡映とスキューを取り上げます。
どちらも、すでに学んだ行列やその合成 の考え方を使って表すことができます。

鏡映
CG画像処理

ある直線を境にして、図形を裏返したように反転させる変換が鏡映です。
鏡に映した像のように、直線を挟んで反対側へ各点を折り返すことから、この直線を対称軸といいます。

座標軸で折り返す鏡映

最も簡単なのは、x軸やy軸を対称軸とする鏡映です。

x軸で折り返す鏡映では、図形が上から下に(または下から上に)反転し、左右方向はそのままです。
つまり、点(x, y)x座標を保ったまま、y座標の符号だけが反転します。

この関係式は、x方向の倍率を1y方向の倍率を-1とした拡大・縮小 の式です。
鏡映は、倍率に負の値を許したスケーリング(拡大・縮小)の特殊な場合だと捉えられます。

復習:拡大・縮小

そこで、拡大・縮小の行列の倍率をに置き換え、同次座標の33列の形で書くと、x軸についての鏡映行列が得られます。また、y軸についての鏡映も同様に考えることができます。

x軸で折り返す鏡映

上下が反転するため、y座標の符号が変わる

y軸で折り返す鏡映

左右が反転するため、x座標の符号が変わる

ちなみに、x方向・y方向の倍率をともに-1にすれば、x座標とy座標の両方が反転します。これは原点の向こう側へ移す変換で、180度回転と同じ結果になります。

座標が入れ替わる鏡映

座標軸ではない直線でも、原点を通る45度の直線y = xで折り返す鏡映を考えるのは簡単です。
なぜなら、直線y = xで折り返すと、各点のx座標とy座標がそっくり入れ替わるからです。

この変換を同次座標の行列で表すと、次のようになります。

直線y = xで折り返す鏡映

なぜ変換行列がこの形になるのかは、行列の掛け算の仕組みから読み解けます。

変換後の1行目の、変換後の2行目のなので、

  • 1行目でを作るには、だけを残したいので、
  • 2行目でを作るには、だけを残したいので、

というように、係数を決めていけばよいのです。

任意の直線で折り返す鏡映

座標軸やy = xのように都合のよい直線ばかりとは限りません。対称軸が一般の斜めの直線である場合は、変換の合成 で学んだと同じ発想を使って考えます。

話を簡単にするため、まず対称軸が原点を通る場合を考えてみます。
この場合は、まず対称軸がx軸(あるいはy軸)に重なるように、図形全体を原点まわりに回転させます。こうすることで、座標軸で折り返す鏡映行列をそのまま適用できるようになります。
鏡映を終えたら、最初に回した分だけ逆向きに回転して、図形を元の向きへ戻します。

つまり、次の3つの変換を順に組み合わせることになります。

  1. 対称軸が座標軸に重なるように回転する(行列
  2. 座標軸についての鏡映を行う(行列
  3. 最初の回転を打ち消すように逆向きに回転する(行列

これらをまとめた合成変換行列は、後から適用する変換を左に書く規則に従ってとなります。
このように、座標軸についての鏡映と回転を組み合わせるだけで、原点を通る任意の直線についての鏡映が表せます。

また、対称軸が原点を通らない場合は、さらに平行移動を加えて、軸が原点を通るように図形全体をずらしてから同じ手順を行い、最後に元へ戻します。回転と平行移動を重ねていくことで、どんな直線についての鏡映も合成変換で表すことができます。

3次元の鏡映

3次元空間での鏡映は、直線ではなく平面に対して対称な位置に点を折り返す変換になります。
この面を対称面といい、xy平面・yz平面・zx平面などを対称面として図形を折り返します。

考え方は2次元の場合と同じで、対称面に垂直な方向の座標のみ符号を反転させます。
たとえば、xy平面についての鏡映では、図形が平面の上下で入れ替わることになるため、変化するのはz座標だけです。

xy平面についての鏡映

xy平面に垂直なz座標だけが反転し、x, yはそのまま保たれる

yz平面についての鏡映ならx座標を、zx平面についての鏡映ならy座標を反転させる、というように、対角線上に並ぶ成分のうち、反転させたい軸の行にある成分を-1にすればよいことになります。

スキュー(せん断)
CG画像処理

トランプの束を横から押して斜めにずらすように、図形を平行四辺形のように歪める変換がスキューであり、せん断とも呼ばれます。

座標軸方向のスキュー

x方向のスキューでは、上下の辺の平行を保ったまま、上の辺を右へずらすように引っ張るイメージで、図形を平行四辺形のように歪ませます。

図形の左下の点を原点に置き、その点と底辺を固定したまま、上の辺を右へずらすと、yが大きい点ほどx方向に大きくずれます。このようにずらすと、図形を囲む長方形は、底辺が固定されたまま上辺だけが横へ滑り、平行四辺形に変形します。

歪ませてできる平行四辺形の左辺は、原点を通る比例関数の直線に沿います。
つまり、図形の各点のx座標はyの値に比例してずれるので、yの値に比例した量をx座標に加えることで、このようなスキューを表すことができます。

ずれの大きさを決める係数aは、比例関数の直線の傾きです。図形を角度で傾けたとき、傾きaは、で求められます。

この関係を同次座標の行列で表すと次のようになります。

y方向のスキューは、役割を入れ替えたものです。今度はx座標が変わらず、y座標がxに比例してずれます。

x軸方向のスキュー

y軸方向のスキュー

注目したいのは、ずれ量aが(左上から右下へ向かう)対角線上から外れた位置、すなわち非対角成分に入っている点です。
拡大・縮小では対角成分が各軸の倍率を担っていましたが、スキューでは非対角成分が「どの座標が、どの方向のずれに、どれだけ寄与するか」を表します。

3次元のスキュー

3次元のスキューも、2次元と同じく非対角成分にずれ量を置くことで表せます。
たとえば、zの値に比例してxyをずらすスキューは、44列の行列で次のように書けます。

どの座標をどの方向のずれに効かせたいかに応じて、対応する非対角成分に係数を入れればよい、という考え方は3次元に拡張しても変わりません。

鏡映やスキューの用途
CG画像処理

スキューや鏡映は、CGや画像処理の分野でよく使われる変換です。

たとえば画像処理では、画像を左右に裏返す反転処理はy軸についての鏡映にあたり、斜めから撮影して歪んだ画像を長方形に整える処理ではスキューを含む変換が使われます。

複雑な変換も、平行移動、回転、拡大・縮小、鏡映、スキューを合成したものとして、より一般的な枠組みでまとめて扱うことができます。
アフィン変換 では、こうした変換をひとつの体系として整理していきます。