画像整理してると、ついつい画像圧縮アルゴリズムについて考えてしまうのは俺だけ?
画像圧縮のやり方
画像圧縮の種類
- 輝度画像 … 各ドットの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