AfterEffectsでRGBtoYCbCr(2)

April 6, 2012
前回の続き...AfterEffectsの「Channel Combiner」ではRGB->YUV変換した後にYUV->RGB変換すると元画像との間に差異が生じてしまうということろまで書きました。ちなみにAfterEffectsの「Channel Combiner」は、おそらくITU-R BT.601変換が行われていると推測。代用できそうなプラグインとか探したんだけど、面倒だし自分でPIxelBenderで書いた方が早そう...と思って調べだすと、色々余計なことがわかって面白かったです。

BT601変換ではまず基本となる輝度(Luminance)を求めるのRGBそれぞれに係数をかけて処理しています。

Y = 0.299R + 0.587G + 0.114B


この辺はWikipediaにきれいにまとめられてました。BT709の場合は係数が違う。 http://en.wikipedia.org/wiki/YCbCr

で、この輝度をもとめる計算なんですが、よく画像処理系のプログラミングでグレースケール画像を求めるのに用いられる「NTSC系加重平均法」というのがあって、これは

Y = 0.298912R + 0.586611G +0.114478B


という式になってます。だけど、ITUのドキュメントにもこんな式は出ていない。この式はCIE XYZの色空間で記されている式で、一見こちらの方が高精度っぽいんだけど...

BT.601 : Studio encoding parameters of digital television for standard 4:3 and wide screen 16:9 aspect ratios
http://www.itu.int/rec/R-REC-BT.601/en

David Bourgin's Color spaces FAQ
http://www.scarse.org/docs/color_faq.html#xyz

「NTSC系...」というのを名称に入れたのはたぶん日本人。Googleで「NTSC 0.298912 0.586611 0.114478」のキーワード検索しても日本のサイトしか出てこない...っていうかそもそもこの係数を使ってるのが日本ばかりっぽい。しかも「Y = 0.298912R + 0.586611G + 0.114478B」だと、輝度が1.0超えちゃう...なんですか、このローカルルール。先のWikipediaのYPbPr式まで遡ればGの係数を「1 - 0.298912 - 0.114478」にするのが正しいのだと思うけど、そもそも規定されてないものだし、だから、ここは素直にNTSCの係数を採用するのがよさそう...っていうか「NTSC系...」を最初に採用したのって誰なんでしょ?いったい当時のコンピュータで何ビットの画像処理するつもりだったんですかね?しかもなんでこれが日本だけで大流行してるのか不思議。

で、更にsRGBの輝度はこの係数じゃ駄目なんじゃないかという素朴な(?)疑問が...。

Wikipedia - sRGB: The forward transformation (CIE xyY or CIE XYZ to sRGB)
http://en.wikipedia.org/wiki/SRGB#The_forward_transformation_.28CIE_xyY_or_CIE_XYZ_to_sRGB.29

でもJFIFもこの係数だからいいのか...?!

Wikipedia - YCbCr: JPEG conversion
http://en.wikipedia.org/wiki/YCbCr#JPEG_conversion

もうよくわからん。そもそも元々のカメラでのYCbCr分離を再現しようとしたらハードの設計まで行っちゃうし、汎用的な使い方としてはあんまり深く考えない方がよさそう...というか無理。きっとアナログ時代にこの辺りの回路設計をしていた人の話を聞いたらすげー面白いと思いますね。

というわけで今回は脱線モードでAfter Effectsとは全然関係ない輝度の話でした...続く。


[関連記事]
AfterEffectsでRGBtoYCbCr(1)
AfterEffectsでのリニア合成のお話(1)
HS_422Chromafix for Nuke