BitmapData.histogram()

>> Histogram.swf (要 FlashPlayer 10 & Webカメラ)

昨日はFlashPlayer 10で追加されたBitmapDataクラスのメソッドである get/setVector() を紹介しましたが、
今日は histogram() というメソッドを使ってみます。
以下、livedocsより

histogram() メソッド
public function histogram(hRect:Rectangle = null):Vector.<Vector$Number>

言語バージョン: ActionScript 3.0
ランタイムバージョン: 10, 1.5
 
BitmapData オブジェクトの 256 値のバイナリ数のヒストグラムを計算します。このメソッドは 4 つの Vector を含む Vector オブジェクトを返します。<Number> インスタンス(Number オブジェクトを含む 4 つの Vector オブジェクト)です。4 つの Vector インスタンスは、赤、緑、青およびアルファの順の各コンポーネントを表します。各 Vector インスタンスには、各コンポーネントの値のポピュレーションカウント(0 ? 255)を表す 256 値が含まれています。
 
パラメータ
 hRect:Rectangle (default = null) ? BitmapData オブジェクトの使用領域です。

戻り値
 Vector.<Vector$Number>

とりあえず、カメラ画像のヒストグラムを毎フレーム描画するだけの簡単なソースコードを載せます。
なお、ここではアルファチャンネルは無視しています。

・ソースコード

0〜255の範囲の値(1つのチャンネルにつき8bit)が256個のビンに入っていて、
返り値のVector[0]が赤チャンネル、順に緑、青、アルファとなっています。

ここで、色空間をHSVに変換して色相(H)値のみのヒストグラムを計算すれば、

hue_hist

のようなカラーヒストグラムも作れます。
ちなみに、RGB値から色相(H)値だけ求めたい場合は色空間の変換までする必要はないです。

ただ、色相値は照明変動に弱く、取得した値が不安定になりやすいという理由から、
動画像処理においては色相値だけを使うということはあまりしません。
一番簡単な対応策のひとつとしては、彩度および輝度にしきい値処理を施し、
それらがしきい値以上の画素の色相値のみを採用するといったアプローチがあります。

ーーーーーーーー
バレンタインFlashのおかえしを催促されても作らなかった僕は、決してクリエイターにはなれないんだと悟りました。
たくさんfavoritesされるようなFlashはどうがんばっても僕には作れません;;
したがって、今回は機械的なメソッド紹介をもってホワイトデープレゼントに代えさせていただきます。

あわせて読む:

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です