All-About調査室 Annex

ふと湧いた疑問や巷を漂うウワサを全部アバウト~に調査・検証
<OCNから漂着 流浪の調査室>

JPEGの悪評は風評被害か? ~ JPEGってなんだ?:12(離散コサイン変換)

2014-08-08 00:26:15 | JPEGの悪評は風評被害か?

次のJPEGステップは必要に応じて間引いたY/Cb/Cr値を水平・垂直に8x8個ずつ集めて
離散コサイン変換にかける処理だ。

離散コサイン変換(DCT)は等間隔に設置した計測ポイントが得た値を周波数の異なるコサイン波
(正弦波と言っても良いが…)を重ね合わせることにより、そのポイントにおいて再現させるもので
使用するコサイン波の周波数と位相は特定されており、
変換後の値は周波数ごとのコサイン波の振幅に「相当」するので、スペクトル分解と表現したりもする。
(数値的には振幅値そのままではないので、“相当”と表現してみた)

水平・垂直各NラインのDCTの定義式は



…と、モノの本には書いてある。
優等生ならぬ身としては、この式の導出については上手に説明できかねる。
ちなみにITU T-81では以下の表現になっている。



アタマに1/4があったりCu,Cvの値が1/√2 or 1だったりで、パッと見で違うように思うかもしれないが、
上の定義式のNに8を代入して
√(1/8) ⇒ (1/2) x (1/√2)
√(2/8) ⇒ 1/2
として、Cu,Cvから1/2を前方に出して、1/2 x 1/2 = 1/4 にしたモノであり、
またx,yとu,vそれぞれ逆になっているが内容は同じものである。

さて、Σの2段重ねを見せられるとどこから計算したものか一瞬ビビるが、



…と、書き改めると計算順がつかみやすくなる。(でもない?)

計算順は右側のΣの処理から始める。
まず通常のJPEGはN=8とし、u,vの範囲は0~7の整数を採るのでU,Vをこの範囲で1組選ぶ。
(最終的にはG(0,0)~G(7,7)の全64個を求めるが、計算は地道にU,V一組ずつ実行する)

f(x,y)は水平・垂直8x8要素のYなりCbやCrの値を表すので、
(x,yともに0~7。例えばF(2,5)は水平に3番目、垂直に6番目の値の意味)
xの値を0に仮決めした上で右側のΣに関してyの値を0から順次増やしながらΣ内の式を計算して総和を求める。

ここである値を選び、xをゼロに仮決めしたときのyに関する総和をF(0)vと表現することにする。

F(0)v = f(0,0) ・cos(vπ/16) + f(0,1) ・cos(3vπ/16) + ・・・ + f(0,7) ・cos(15vπ/16)

同様にxの値を1に仮決めしてyに関する総和、つまりF(1)vを求め・・・と進めて、x = 0~7に対するF(x)vを全て求める。
・・・と、上式は、



と表せる。

次に、あるu値を選んだ上で、
この式のΣの中を先と同様に、先のF(x)vを用いつつ計算し、xについて総和を求めて、
それに先に選んだu,v値に従ったα(u),α(v)値をそれぞれ掛ければ、選択したu,vに対するG(u,v)が得られる。

最終的に求めたいのはGの8x8要素(全64要素)のマトリックスなのだが、
上記まででは、Gの内の特定の1要素(仮にuに3、vに5を選んだのならG(3,5)だ)
求めたことになる。
これを64回繰り返す・・・と思うと、気が遠くなる

忍耐と気力があれば、この考えのまま計算プログラムを書き起こすことは可能だが、
ワタシにはそれが若干不足しているので、もう一工夫を試みる。



最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。