モザイク
2010/01/08 20:54 - AS3.0
「OpenGL+GLSLによる画像処理プログラミング」P46 によると、モザイク処理には、ひとつのブロックを何色で塗りつぶすのかを決めるロジックにより、以下の二つに分類されるんだそうな。
- ブロック内部の画素値の平均値で塗りつぶすもの
- ブロックの代表点の画素値で塗りつぶすもの
前者は特に説明は要らないでしょう。
で後者。代表点って何よ? すべてのブロックで共通に設定する任意の点らしい。 もっぱら左上のピクセルに割り当てることが多いっぽい感じ。 まぁ左上のピクセルなら、モザイクのサイズ如何に関わらず、絶対に存在するピクセルだから妥当ですよね。
平均値によるものは原画像がある程度保存されるが、代表点はそうでもないので、情報を隠す目的なら代表点方式の方が良いだろう、と書かれています。
以下のサンプルは、上が平均値によるもので、下が代表点によるものです。代表点は左上に設定しました。
たしかにずいぶん雰囲気が変わりますね。
ところで、実際問題として考えると、代表点によるモザイクって使うかなぁ、少なくとも自分は使わなそう、という印象を強く受けたので、オレオレライブライリーに登録するのは平均値によるモザイクのみにします。
で、下がコード全文。
ブロックの色の平均値を求める際に、このあいだの平面分割 WebCam で知恵をつけた BitmapData.histogram を使っています。 ただしブロックの辺の長さが 16 以下になったら(つまりブロック内のピクセル数が256以下になったら)、histogram ではなく、ピクセル走査で平均値を求めるようにしました。
まぁ速度的にどんだけ影響あんのか分かんないんですけどねー。
ところでこういう処理は、 英語では mosaic と言うよりも、pixelization と言う方が一般的だそうな。
それに則ってクラス名は EffectorPixelization としました。