Javaで画像圧縮ソフトを作って内部処理を見てみる

Javaで画像圧縮ソフトを作って内部処理を見てみる

2020年6月12日
Facebook にシェア
Pocket

概要

3年前くらいに書いたカオスコードなので、ソース乗せるのは一旦恥ずかしいです。

画像を3次元空間に見立てて、フーリエ変換を行い分解した後情報量の少ないと思われる場所を消して復元します。
ここで言う「情報量が少ない」=「高周波成分」

上で言ってることの軽い説明ですが、下のツイートがわかりやすいです。


小さい円を消してもほぼ同じ図形を作れますよね!
その原理を利用して画像圧縮を行ってみたいと思います。

まずは見よう!

この画像を使います。

フーリエ変換をしたいので高さと幅を雑に2の累乗にします。

白黒です。カラーにしたければRGBそれぞれにフーリエ変換すればいいんですが、めんどくさいので白黒でやります。

それをフーリエ変換して、係数をマッピングした画像に変換してみます。

赤  :係数が大きい(重要)
周波数:中心に行くほど高周波

この画像より、高周波成分の大部分は利用されていないことがわかりました。

次は真ん中らへんの係数を完全に0にして、画像を復元してみます。

まあまあな画質で復元できました。

フーリエ変換して復元するために必要な情報量は赤青の画像と全く同じなので、上の例だと単純に70%くらい容量削減できているということになります。

めっちゃ情報量削減してみる

流石に元の画像がわからなくなっちゃいましたね。
一番上にあったツイートを例にすると、大きい円3つくらいだけで絵を書こうとしているみたいな状態になってます。(うまく説明できない)

逆に、重要な部分にマスクをすると…

一瞬で情報が失われます。おもろい。

以上。