このサイトは、只今WEB業界で活躍中のデザイナー、プログラマーの方々の情報を集めたweb統合情報サイトです。

Archives Details

圧縮アルゴリズムの話 〜可逆と非可逆をざっくり整理してみる〜

AI・Bot・algorithm

2021.06.25

この記事は最終更新日から1年以上が経過しています。

どもです。

普段なにげなく扱っている画像やテキストのファイル、気がつけば「これってどうやって小さくなってるんだ?」とふと気になることがあるんですよね。zip にしたらサイズが減る、JPEG だと写真がいい感じに軽くなる。当たり前に使っているけど、中身のアルゴリズムって意外とちゃんと説明できなかったりします。

ということで、今回は「圧縮アルゴリズム」について、自分の頭の整理も兼ねてざっくりまとめてみました。大きく分けると 可逆圧縮非可逆圧縮 の2つに分かれます。

可逆圧縮(元に戻せるやつ)

可逆圧縮は、その名のとおり 圧縮したものを完全に元どおりに復元できる タイプの圧縮です。テキストやプログラムみたいに、1ビットでも変わったら困るデータに使われます。zip なんかもこっち側ですね。

代表的なものを2つ見ていきます。

ランレングス圧縮

参考: 連長圧縮 – Wikipedia

いちばんイメージしやすいのがこのランレングス(連長圧縮)です。同じデータが連続している部分を「データ+繰り返し回数」にまとめる という、すごくシンプルな発想。

たとえばこんなデータがあったとして。

A A A A A B B B B B B B B B A A A

これを「A が5回、B が9回、A が3回」と読み替えて、こう表現します。

A 5 B 9 A 3

元が17文字だったものが6個の情報で済んでしまう。同じ値がずらっと並ぶデータほど効果が出るので、ベタ塗りの多い画像なんかと相性が良いんですよね。逆に、バラバラなデータだとかえって増えることもあるので、そこは使いどころ次第かと思います。

ハフマン符号化

参考: ハフマン符号 – Wikipedia

もう一つの定番がハフマン符号化です。こちらは よく出てくるデータには短いビット列を、めったに出てこないデータには長いビット列を割り当てる という考え方。

普段、文字は全部おなじビット数で表現されてますが、出現頻度に応じてビットの長さを変えてあげれば、全体としてデータ量を減らせるよね、という発想です。出現回数を集計して、頻度の低いものから木構造(ハフマン木)を組み上げていくことで、最適な符号の割り当てを決めていきます。

ランレングスが「連続」に注目するのに対して、ハフマンは「頻度」に注目する、という違いで覚えておくと整理しやすいかと思います。

非可逆圧縮(元には戻せないけど軽い)

さて、ここからは非可逆圧縮です。

非可逆はその逆で、元のデータに完全には戻せない代わりに、ぐっと小さくできる タイプ。「多少情報が削れても人間の目や耳には分からないでしょ」というところを狙って、思い切ってデータを捨てます。写真や音声、動画みたいに、ちょっとくらい劣化しても実用上問題ないデータで大活躍します。

フーリエ変換(JPEG)

参考: フーリエ変換 – Wikipedia

JPEG の圧縮で出てくるのがフーリエ変換まわりの考え方です。ざっくり言うと、画像を「波(周波数成分)の集まり」として捉え直す ことがキモになります。

画像を周波数の世界に変換してやると、「細かく変化している高周波の成分」と「ゆるやかに変化している低周波の成分」に分けられます。人間の目は細かい変化(高周波)には意外と鈍感なので、その部分の情報を削ってしまっても、見た目はそんなに変わらない。ここを削ることでサイズを大きく落とせる、というわけですね。JPEG の画質設定をぐっと下げるとモヤッとしたノイズが出てくるのは、まさにこの高周波成分を捨てているからなんだなと。

PNG quant / メディアンカット

参考: 減色アルゴリズム(メディアンカット法) – PETITMONTE

最後に PNG の減色まわり。pngquant みたいなツールで使われているのが メディアンカット法 というアルゴリズムです。

これは 画像で使われている色の数を、いい感じに減らす(減色する) ための手法。フルカラーだと膨大な色数になりますが、それを代表的な色だけに絞り込んでパレット化することで、ファイルサイズを小さくします。色空間の中で色を箱に詰めて、その箱を「中央値(メディアン)」のところでカットして分割していく……というのを繰り返して、最終的に必要な色数まで絞り込んでいくイメージですね。

PNG 自体はフォーマットとしては可逆なんですが、こうやって事前に減色してから保存することで、見た目をなるべく保ちつつ容量を落とせる、という合わせ技になっています。

まとめ

ということで、圧縮アルゴリズムをざっくり整理してみました。

  • 可逆圧縮 … 完全に元へ戻せる。ランレングス(連続に注目)、ハフマン符号化(頻度に注目)など
  • 非可逆圧縮 … 戻せない代わりに小さくできる。フーリエ変換を使った JPEG、メディアンカットによる減色など

普段ツール任せにしている圧縮も、中身の理屈を知っておくと「このデータならこっちの形式が向いてるな」みたいな判断がちょっとだけ早くなる気がします。自分も書きながら頭の中が整理できて、なかなかに胸アツでした。

ではではぁ。またまたぁ。

Comment

Related Article

【Claude Code】フル稼働。ToDo Appを様々なGUIフレームワーク用いて作らせる。

2026.05.24

効率の良い AI駆動開発について考える

2025.11.09

AIのために働け。AI リーダブルコーディングな未来。

2025.05.21

5分で覚える Flutter Flameで作る Wave Function Collapse – 波動関数崩壊アルゴリズム

2023.12.20

圧縮アルゴリズムの話 〜可逆と非可逆をざっくり整理してみる〜

2021.06.25

TypeScriptでStateMachine

2021.05.16

パックマン 解析プログラム動画から見る 追跡アルゴリズム

2020.09.23

5分で覚えるAI Minimax(ミニマックス)法とalpha-beta法

2016.05.14

JavaScriptでユークリッド距離とピアソン相関係数

2016.05.03

LINE BOT API Trial で WordPress + LINE BOT の Web帳BOT を作ってみました。

2016.04.30

CATEGORY LIST

LATEST NEWS

Raspberry Pi 5 でマインクラフトサーバーを立てる(Java版 × 統合版クロスプレイ対応)

RaspberryPi

2026.06.24

ラズパイが高い。

RaspberryPi

2026.05.26

【Claude Code】フル稼働。ToDo Appを様々なGUIフレームワーク用いて作らせる。

AI・Bot・algorithm

2026.05.24

Macで歩く「たのしいバイナリの歩き方」うさみみハリケーンの代わりに、Cheat Engine / Bit slicerを使用する

アセンブラ

2026.04.12

Macで歩く「たのしいバイナリの歩き方」

アセンブラ

2026.04.10

【Railway】ひたすら安く個人開発サービスを運用する計画

サーバー

2026.04.06

たびのきろく

イベント

2026.02.23

【Railway】MySQLサービスをコスト抑えて運用する

運用

2026.01.19

あけましておめでとうございますmm DjangoアプリをRailwayに移行する。

運用

2026.01.06

効率の良い AI駆動開発について考える

AI・Bot・algorithm

2025.11.09

MacとClaude Codeで構築する cc65(NES)開発環境

Game

2025.10.24

Three.js - ShaderMaterialで、ブレンドシェイプ(MorphTarget)アニメーション対応

JavaScript

2025.10.15

RANKING

Follow

SPONSOR

現在、掲載募集中です。



Links

About Us

WEBデザイナーの、WEBデザイナーによる、WEBデザイナーの為のサイト。「みんなで書こう!」と仲間を募ってみたが、結局書くのは自分だけとなってしまいました。日々のメモを綴っていきます。

Entry Profile

Graphical FrontEnd Engineer
- Daisuke Takayama

MAD CITY 北九州市で生まれ育つ。20代はバンド活動に明け暮れ、ふと「webデザイナーになりたい。」と思い、デジタルハリウッド福岡校入学。卒業後、数々の賞を受賞、web業界をざわつかせる。
現在、主に、ゲーム制作中心に港区六本木界隈で活動中。

FOLLOW US