手習ひデジタル信号処理(146) Scilab、{IPCV}、離散コサイン変換DCTと逆変換

Joseph Halfmoon

今回は離散コサイン変換 Discrete cosine transform (DCT) とその逆変換。「空間」内の画像信号を「周波数」領域へと変換(transform)するものと、その逆で画像信号に戻すもの。静止画像、動画などの「圧縮」「伸張」に度々登場する現代社会を支える?基礎技術の一つデス。自分、持ち上げすぎか?

※「手習ひデジタル信号処理」投稿順 Indexはこちら

※Windows11上の    Scilab2024.0.0およびScilab上のScilab IPCVツールボックスを使用させていただいております。

離散コサイン変換

みんな大好きFFTのディスクリート版のDFTとDCTは「親戚筋」といっていい変換じゃないかと思います。どちらも空間(または時間)領域の信号を周波数領域に変換できるもの。ただし、DCTの方が算術的にもいろいろ単純化できる部分が多く、「ハードウエアで計算」などというときにはお楽じゃないかと思います。遥かな太古1990年代に、DVD以前のCDにビデオを録画する規格があり、MPEGという動画圧縮方式を採用してました。それ向けチップの設計の増援に駆り出され、そのときDCTというものに初めて触れました。訳もわからず計算するハードを設計した遠い記憶。今だに素人、詳しくは「Yizawa Lab」様の以下のページなどご参照ください。Yizawa Lab様、あざ~す。

離散コサイン変換(Discrete Cosine Transform ; DCT)

imdct関数とimidct関数

Scilab IPCVのDCT、IDCT関数は以下のとおりです。

    • imdct
    • imidct

どちらも1次元または2次元の配列を引数にとって、同じ次元の変換結果を返す関数です。画像信号なら空間的に広がった2次元配列ってことだね。時間的な信号なら1次元配列ということでよいかしら。知らんけど。

サンプル処理例

ScilabのHELPファイルに記載のある処理例をちょいと修正して、元画像を表示、元画像にDCTをかけた結果を表示、そしてDCTかけたものをIDCTにかけた結果を表示という処理例を作りました。DCTかけてIDCTで戻すのだから元画像に戻るんだよね。

S = imread(fullpath(getIPCVpath() + "/images/measure_gray.jpg"));
S1 = imdct(S);
S2 = imidct(S1);
subplot(131); title('Original'); imshow(S);
subplot(132); title('DCT'); imshow(S1, jetcolormap(256));
subplot(133); title('IDCT'); imshow(S2./255);

結果が以下に。DCT_IDCT

確かに元に戻っている気がする(気がするだけなのね。。。)

まあよくある応用的には、DCTかけた後で、高周波成分などどうせ「よく分からない」からネグってしまえ、とか「いろいろ」加工を重ねた上にエンコード工夫してデータ量自体を激減させることになるのでしょう。データ量減ったのに見た目は元に戻った気がするのが一番だと。ここではいろいろやる前の素の変換のみです。一撃でやってくれるのでお楽。

手習ひデジタル信号処理(145) Scilab、{IPCV}、画像の強化と修復、その2 へ戻る

手習ひデジタル信号処理(147) Scilab、{IPCV}、距離変換、距離の計算3通り へ進む