エンボス
2010/01/22 20:20 - AS3.0
先般、エッジ検出(3) ロバーツを見たときにちらっと書きました。
たいていのエッジ検出は水平と垂直の二つの ConvolutionFilter 適用した二つの BitmapData をマージすることでおこなっていますが、ロバーツはそれを45度斜めにしたものだ、と。
そしてそのマトリクスの値を見るに標準エッジ検出の斜め版らしく思われる。 だったらプレヴィッツやゾーベルの斜め45度版もあってもいいじゃない、と。
そして、そのプレヴィッツやゾーベルの斜め45度版というのは、「OpenGL+GLSLによる画像処理プログラミング」P122~によるとエンボスの処理がそれらしいっす。
より正しく述べると、実は若干違います。 0度から360度までを45度刻みの角度で表した8つのマトリクスが、エンボス処理をおこなうマトリクスです。
エッジ検出では、水平と垂直など、90度に交差する二つのマトリクスを組みにして使いましたが、エンボスでは一つのマトリクスしか使いません。 なので BitmapData を clone して、個別に ConvolutionFilter を適用して、それからマージするという手間はないわけです。
ところで、この8つのマトリクスは何なのかというと、光源の方向を8つ設定できるということなんだそうです。
エンボスのためのマトリクスは、以下の法則で設定します。
- 中心は 0
- 光源が存在する側を -1
- 光が進む側を 1
- 総和が 0
この法則に則れば、3×3のマトリクスなら45度ずつの設定ができますよね。 具体的にプレヴィッツで設定すると、以下のようになります。
マトリクスの要素が45度ずつグルッと回っているのが分かりますね。
以下のサンプルは、このマトリクスをプレヴィッツではなくゾーベルで設定したものです。 ラジオボタンを押すと、それぞれの角度のマトリクスを適用したエンボスに切り替わります。
エンボスは水平や垂直よりも斜め45度からの方がカッコええっすね。
ああ、そうそう、このエンボスは ConvolutuinFilter の第5引数の値を 128、すなわち色の256階調の真ん中の値を設定しています。だから灰色になってるんですね。 上記のマトリクスのコードの一番下をご参照ください。