画像整理してると、ついつい画像圧縮アルゴリズムについて考えてしまうのは俺だけ?

画像圧縮のやり方

  • フィルター … データの値が二次元の連続値であることを利用して、圧縮しやすいよう画像を変換する。
  • 量子化 … 不可逆圧縮の場合、ここでデータを削って更に圧縮しやすくする。
  • 符号化 … 実際に圧縮する。

画像圧縮の種類

  • 輝度画像 … 各ドットのRGBの輝度値を直接記録する。
  • パレット画像 … パレットデータと、各ドットのパレット番号を記録する。
  • 不可逆画像 … 画像を劣化させてサイズを圧縮した画像

画像の種類

  • モノクロ画像
  • カラー画像

画像圧縮の特性

  • 圧縮重視 … 圧縮、展開に時間をかけて、サイズを圧縮する。
  • 展開速度重視 … 圧縮に時間をかけて、サイズを犠牲にして展開速度を重視する。
  • 速度重視 … サイズを犠牲にして圧縮、展開速度を重視する。

モリー消費も気にする。画像じゃあんまりいらないけど、ランダムアクセス性能があってもいい。

フィルターの案

A B
C X

 2x2の画像の場合、画素列はABCXの順で並ぶ。最後のXの画素値は、ABCの画素値からXを予測し、予測と実際の値の差分を記録するフィルターを考える。

単純なフィルター

X予測値 = B+C-A

PNGのPaethフィルタの場合

X = B+C-Aで計算した後、abs(A-X),abs(B-X),abs(C-X)を算出して

  • abs(A-X)が一番小さい場合、X予測値 = A
  • abs(B-X)が一番小さい場合、X予測値 = B
  • abs(C-X)が一番小さい場合、X予測値 = C

 A=100 B=150 C=200の時、X=250で、abs(250-200)が最少なので、X予測値 = 200

Aが、BとCの間にない場合について

 例えば A=100 B=150 C=200で、Aが150〜200の範囲に無い場合。何もしなければ、X予測値 = 150+200-100 = 250

MEDの場合

  • A > max(B,C)のとき、X予測値 = min(B,C)
  • A < min(B,C)のとき、X予測値 = max(B,C)

 A=100 B=150 C=200の時、100 < min(150,200)なので、X予測値 = max(150,200) = 200

俺の妄想。パターンディザリング重視。

  • abs(A-B) > abs(A-C)のとき、X予測値 = A+B-C
  • abs(A-B) < abs(A-C)のとき、X予測値 = A+C-B

 A=100 B=150 C=200の時、abs(100-150) < abs(100-200)なので、X予測値 = 100+200-150 = 150