« ゆっくりボイス(Softalkや棒読みちゃん等)をAviUtlで扱う場合は0.99k2以降がオススメ | トップページ | YUV(8bit~10bit)で表せる色数の再計算 »

2012年3月 9日 (金)

1677万7216色の画像をAvisynth 2.6でYV24にしてからRGB24に戻して色を数えてみた

以前の記事で、
  「RGB24の16777216色のうち、8bit~10bitのYUVで表せる色の数」
をプログラムで計算してみたのですが、今回はその記事の続きです。

今回は実際に、
  「RGB24の全ての色を含んだ画像を一度8bit YUVにしてからRGBに戻す」
という処理をして、処理後の色数を調べてみます。

使用するツールやソース画像などは以下のとおりです。
x264スレでIrfanViewに画像の色数を数える機能があることを教えてくれた人ありがとう。

 ■使用ツール

    ● Avisynth 2.6 Alpha3 (20110525)

    ● AvsPmod 2.2.1

    ● IrfanView 4.32窓の杜

 ■ソース画像

    ● 以下のサイトにある「all16777216rgb.png」
     各ピクセルは全て異なる色になっており、
     4096x4096でRGB24の16777216色全てを表しています。

        All 16,777,216 RGB colours - David Naylor: Blog

 
これまではなんとなく「Avisynth 2.5.8」を使っていたのですが、
今回の調査ではYUV4:4:4での変換処理が必要だったこともあり、
今更ながら「Avisynth 2.6 Alpha3」を導入してみました。
Avisynth 2.6では、2.5.8にはなかったYV24(YUV4:4:4)などの
新たな色空間がサポートされています。

(SEt氏による「Avisynth 2.6 MT」というのもあるようですが、
 とりあえず今回は「Avisynth 2.6 Alpha3」のほうを使っています。)

調査手順は以下のとおりです。

   1.以下のようなavsファイルを作成。
     ソース画像を読み込み、一度YV24(YUV4:4:4)にしてからRGBに戻しています。
     YV24はYUV4:4:4なので、各ピクセルが独自にY,U,Vの値を持ちます。
     要するに周囲のピクセルの影響を受けずにYUV化できます。

        ImageSource("all16777216rgb.png",end=9,fps=1)
        ConvertToYV24(matrix="Rec601")
        ConvertToRGB(matrix="Rec601")

   2.AvsPmodで1のavsファイルを開き、プレビュー画面を表示。
       プレビュー画面右クリック→「Save image as...」
     でPNGファイルを保存する。

   3.2で保存したPNGファイルをIrfanViewで開き、
       メニュー→Image→Information→「Number of unique colors」
     で、画像に含まれる色の数を調べる。

   4.1のavsにあるConvertTo~の引数のmatrixを変え、
     「Rec601」「PC.601」「Rec709」「PC.709」のそれぞれについて3の色数を調べる。

 
このようにして調べた結果、変換後の画像の色数は以下のようになりました。

  今回の調査結果(RGB画像をYV24化してRGB24に戻したものの色数)
     8bit-Rec601: 2667378 (前の調査結果との差: -288558)
     8bit-PC.601: 3975919 (前の調査結果との差: -286441)
     8bit-Rec709: 2760365 (前の調査結果との差: -286059)
     8bit-PC.709: 4114580 (前の調査結果との差: -285646)

  参考:前の記事での調査結果(YUVが全ての値を取り得るという前提で計算した色数)
     8bit-Rec601: 2955936
     8bit-PC.601: 4262360
     8bit-Rec709: 3046424
     8bit-PC.709: 4400226

前の記事での調査結果と比べると、どれも28万色くらい色数が減ってますね。

前の記事では、
   「YUVはYUV範囲内の全ての値を取る
という前提で計算を行っていました。つまりYUVの値は
   圧縮レンジの場合: Y=16~235、U,V=16~240
   フルレンジの場合: Y=0~255、U,V=0~255
の範囲にある全ての値、全ての組み合わせを取るものとして計算されています。
しかし、Chikuzen氏の記事でも紹介されていた
    YUVとRGBの比較(DTVかくし味)
を読んでもわかるとおり、YUVが取り得る範囲はRGBの範囲よりも広くなっています
つまり、
    「本来RGBとの変換には使われない、RGB範囲外のYUV値の組み合わせ
が存在するということになります。
前回の記事では、そういったRGB範囲外のYUV値の組み合わせも計算し、
飽和処理などで無理やりRGB値に結び付けていたわけです。
そんなわけで、ぶっちゃけるとあまり適切ではない結果が出ていたのかなと・・・。orz

しかし、今回の調査では
  1.最初に、元になるRGB画像からConvertToYV24()でYUV値を求める。
  2.次のYUV→RGB変換では、1でRGBから求められたYUV値だけを使う。
となっています。
つまり、
    「RGB範囲外のYUV値の組み合わせは使わない
という前提で変換処理を行っていることになります。
その他の要因もあるかもしれませんが、こういった違いが28万色の差として出たのではないかと思います。
(このへんは自分でも考察が甘い気がするので詳しい人のツッコミ希望・・・)

元々のRGBデータあってのYUVですから、「YUVが表せる色数」については
今回の調査結果を採用すべきなのでしょうね。
そんなわけで、大雑把に言うと

  「8bit YUVで表せる色の数は、270万~400万色前後」

というのが今回の記事の結論となります。

9bit-depthや10bit-depthについては今回の手法では調べられないので、
前の記事のプログラムを
   RGB24→YUV→RGB24
という流れで計算するように改造して調べてみたほうがよさそうですね・・・。

何かおかしなことを言っていたらコメント欄でツッコミをお願いします。

 
★2012/3/13追記:
  前の記事のプログラムを修正して再計算してみました。

    → YUV(8bit~10bit)で表せる色数の再計算
 

|

« ゆっくりボイス(Softalkや棒読みちゃん等)をAviUtlで扱う場合は0.99k2以降がオススメ | トップページ | YUV(8bit~10bit)で表せる色数の再計算 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1278146/44421607

この記事へのトラックバック一覧です: 1677万7216色の画像をAvisynth 2.6でYV24にしてからRGB24に戻して色を数えてみた:

« ゆっくりボイス(Softalkや棒読みちゃん等)をAviUtlで扱う場合は0.99k2以降がオススメ | トップページ | YUV(8bit~10bit)で表せる色数の再計算 »