モノトーンフィルター

ちょっと故あって基本的な事からちゃんと埋めて行こう、って自分の中でなったので今日はモノトーンフィルターについて調べました。

ベリーダンスのモーション落としてきたので今日はこんな画像をモノクロにしてみましょう。

とりあえず思いついたものが、RGBの平均値を出力すればいいんじゃないの?って。それが以下

//=============================================================================
// ピクセルシェーダ
// (頂点シェーダは入力をそのまま出力)
//=============================================================================
float4 PS(
  float2 Tex: TEXCOORD0
  ) : COLOR 
{
  float4 Color = tex2D( ScnSamp, Tex);
  float4 AVE = float4( 0.3333333f, 0.3333333f, 0.3333333f, 0.0f );
  float RGB_AVE = dot( Color, AVE );
  return float4( RGB_AVE, RGB_AVE, RGB_AVE, 1.0f);
}

結果画像。


まあ、そうだよねっていう画像が出てきたのですが、一応調べてみるとどうやら普通はYIQとかに変換してモノクロを作成するみたい。

色空間 - Wikipedia - http://ja.wikipedia.org/wiki/%E8%89%B2%E7%A9%BA%E9%96%93

ここ見ると詳しく書いてあるけど、たとえばYIQってのは放送用だったりする。つまり、テレビとか画像で見てる「モノクロ」ってのはこっちのことをさすみたい。ちなみにYIQでモノクロを作成すると以下のようになる。

//=============================================================================
// ピクセルシェーダ
// (頂点シェーダは入力をそのまま出力)
//=============================================================================
float4 PS(
  float2 Tex: TEXCOORD0
  ) : COLOR 
{
  float4 Color = tex2D( ScnSamp, Tex);
  float4 YIQ_Y_AXIS = float4( 0.299f, 0.587f, 0.114f, 0.0f );
  float Y = dot(Color,YIQ_Y_AXIS);
  return float4( Y, Y, Y, 1.0f);
}

結果画像。


よくわかんないので比較用のシェーダ書いて画像出してみた。左がRGB、右がYIQ。


そんなに違いはないんだけど、水着の青い部分がちょこっと黒味がかってる?というかRGB平均と比べたら、YIQのは重みが違うだけだからそんなに違いないのは当たり前か!式から見ると青が弱めで緑が強いのか。弱いって事は0.0fに近いって事だから黒く写る、って事で確かに画像と一致してますね。

なるほどー。今日はこんなところで。