みけCATのにっき(仮)
つれづれなるまゝに、日くらし、PCにむかひて、心に移りゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。
(本当か!?)
出典

画像を情報を壊さずにJPGでエンコードする

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

画像を情報を壊さずにJPGでエンコードする

投稿記事 by みけCAT » 7年前

画像を普通にJPGでエンコードすると、情報が破壊されてしまいます。
(JPEG 2000とかいう無劣化にもできる形式もあるらしいですが、知りません)

そこで、JPGのエンコードの特徴を考え、破壊ポイントをすり抜けることで、情報を壊さずにJPGでエンコードしてみます。
※これはネタです。普通は画像を壊されたくなければPNGとかの可逆圧縮形式を使え。

まず、JPGのエンコードのしかたをおさらいします。
  1. 画像をYCbCrに変換する
  2. 画像を8x8ピクセルのブロックに分割する
  3. それぞれのブロックを離散コサイン変換する
  4. 量子化テーブルに従って値を割り算する
  5. ジグザグな順番でエンコードする
これをもとに、以下のようにして破壊を回避します。
  1. 画像をYCbCrに変換する → ピクセルのR, G, Bの値を統一してきれいに変換できるようにし、R, G, Bの情報をを別々のピクセルで保存する
  2. 画像を8x8ピクセルのブロックに分割する → (対策なし)
  3. それぞれのブロックを離散コサイン変換する → ブロック内全てを同じ色にする
  4. 量子化テーブルに従って値を割り算する → 割る数を十分小さくする。実験の結果、8なら劣化しなそうであることがわかった
  5. ジグザグな順番でエンコードする → (対策なし)
実装して適当な画像数枚で試した所、JPGに変換しても情報が劣化していないようでした。

実装コード(libjpeg、libpngおよびzlibを使用しています)
► スポイラーを表示

コメントはまだありません。