235
146

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

画像圧縮するベストな方法(2025)

Last updated at Posted at 2025-12-15

TL;DR

画像圧縮の性能比較ができるWebインターフェイス作ったので見てね。
https://fukushimalab.github.io/spcp/
ランディングページが100MB読み込み。
いろいろスイッチしてデータを眺めるとトータルデータ量3GBくらいなので注意。

この内容を含めて画像圧縮で共同研究・技術相談がしたいかたは著者の福嶋X)までご連絡ください。

この記事は、下記内容(画像圧縮・動画圧縮の国際会議)を元に書いたものです。
原稿は上記リンク先からたどれます。

N. Fukushima, Y. Maeda, Y. Kameda, and O. Watanabe,
"Benchmarking JPEG, MozJPEG, Jpegli, JPEG2000, JPEG XR, JPEG XL, WebP, HEIC, and AVIF-AOM/SVT: An Objective Quality and Coding Time Evaluation Across Encoder Configurations,"
in Proc. Picture Coding Symposium (PCS), Dec. 2025.

はじめに

画像圧縮は画像処理の入出力で使う基本です。
その割には、結構適当に扱われています。
この記事では、画像圧縮のために見ないといけない項目を示すとともに、それを確認するインターフェイスを紹介します。

品質評価でやってはいけないこと

画像圧縮は、品質スイッチのQP値(だいたい0-100の値)で品質とサイズをコントロールできます。
でも、性能評価しているサイトでこのQP値をそろえて、いろんな圧縮ツールを比較しているところが多すぎます。
これは、全く意味がありません。

  • 車Aと車Bのアクセルを踏む深さを同じにした時に出る速度を比較しているのと同じです
  • 家と職場で蛇口のひねる量を一緒にした時に出る水の量を比較しているのと同じです

そろえているのは、速度や流量をコントロールするレバーであって、その操作量をそろえることに意味はありません。
「リッターあたりの速度」とか「水量あたりの洗浄能力」などで評価しないといけません。

画像圧縮の場合は、「圧縮後の画像サイズ」か、「画像の品質」を同等にそろえてあげないと比較できません。

下記グラフは、横軸にQPを取って比較したグラフです。
一見、HEIC(HEIF)、JPEG XR、AVIFの順に性能が良いように見えますが、そんなことはありません(後述します)。

image.png
図:QPでそろえた各画像圧縮ツールの品質(PSNR)

また、これは評価軸としてPSNRを使ってますが、PSNRが良ければ人間にとって良い画質とは限りません。
PSNRよりもよい指標であるSSIM、MS-SSIMなど評価基準は世の中に無数にあります。

圧縮ツール(エンコーダ)の評価に必要なもの

圧縮ツールの性能は、圧縮画像の「サイズ」とその時の「画像品質」、そしてそれらが段階的に変化したものであることが分かります。(50%圧縮で品質40、70%圧縮で品質60等)

サイズは、画像圧縮の業界では、bpp(bit per pixel)と呼ばれる1画素あたりの平均ビット数で表されることが多いです。
カラー画像8bitの場合は、24bppが非圧縮状態です。もしサイズが8bppなら33%に圧縮されています。

品質は、PSNRを代表として、SSIM、GMSD、VMAFなどたくさんの画像品質方法があります。OpenCVで使える画質評価はここを参照してください。
このPSNRは非常に性能が良くないことは明らかになってますが、どの指標がベストなのかはまだ決定版はありません。

つまり、画像1つに対して、QP値を変えながら、サイズ情報(bpp)と様々な品質情報を集めれば、各圧縮ツールの性能が測れます。
これを、横軸にbpp、縦軸に評価指標を並べたグラフをRD曲線と呼びます。
先ほどのグラフと違って横軸がbppになっています。
これなら、画像サイズが同一だった時の画像品質値が測ることができて各種エンコーダの性能が測れます。
下記にRD曲線の例を示します。RD曲線では、左上に点があるほど少ないビットで良い品質の画像を復元できるエンコーダであることが分かります。
画質スコアが大きいほどいい画質を表す場合は左上、0に近い程いい画質を表す場合(GSMDやButteraugli)は右下ほどいいものになります。
下記にRD曲線のグラフを示します。
HEICとAVIFがPSNR指標として最も良いエンコーダであることが分かります。

image.png
図:RD曲線(PSNR)

下記はSSIMULACRA2という評価指標で同じくRD曲線(+x軸を対数軸で)を書いたものです。
この場合はAVIFの性能が最も良いエンコーダであることが分かります。
image.png
図:x対数軸のRD曲線(SSIMULACRA2)

このように、評価指標によってどのエンコーダが良いかはぶれるのですが、決定版はないためどれがいいか比較するには網羅的に試すのが妥当です。

グラフで評価するのがめんどくさい時はBD-Rate(Bjøntegaard delta bitrate)を使います。
下記グラフは、基準となるエンコーダ(今回の場合はJPEG)からの増分をプロットしたRDカーブです。
これは各bppでどれくらい良くなっているかが分かるグラフです。
ざっくり言えば、この増分を、見たいbppの範囲で重み付きで積分したものがBD-rateです。
範囲内で平均何%基準となるエンコーダからファイルサイズが減らせたかを示すスコアになります。

image.png
図:JPEGからの相対性能を扱ったRD曲線(PSNR)

やったこと

必要な情報は、サイズと様々な画像品質尺度ということが分かりました。
あと、各画像を圧縮するのに必要だった計算時間や、それを再生するのにかかる計算時間もあるといいですね。
というわけで、いろんな圧縮ツール、設定で力業で全部集めてきました。

計算時間は、だいたい3か月くらいです。
画像917枚を408種類のエンコーダでQP100段階で圧縮して、28種類の評価指標で評価したので、

  • 37,413,600(3.7千万)回だけ画像圧縮して、
  • 1,047,580,800(10億)点のサイズ・指標のペアを集めました。
    • この点のデータが3GBです。

画像データセット

  • 画像917枚(平均サイズ1Mピクセル)
    下記のように、画質評価や画像圧縮用のいろんなデータセットから画像を集めて全部圧縮しました。
    image.png
    図:データセットの代表的な画像(スケールはそろえてあります)

画質評価指標

  • 28種類+{bpp、QP, 圧縮時間、複合時間、総合時間}
    採用したのは下記です。
    PSNR (Y, all)、SSIM (Y, color)、MS-SSIM (Y, color)、IW-SSIM (Y, color)、VIPp (Y, color)、GMSD (Y, color)、NLPD (Y, color)、FSIM (Y, color)、MDSI、Butteraugli (p1,2,3 max)、SSIMULACRA2、VMAF。

これらの指標のオリジナルは、Matlab実装だったり、C++実装だったりするんですが、これだけ評価指標があると画像圧縮の時間よりも長い時間画質評価していたので、全部SIMDで書き直しました。

OpenCVから呼び出せるようにしたので画質評価用成果物はそのうちリファクタされたらだすと思います。

圧縮エンコーダ

  • 10種類とその各種設定値408
    エンコーダは、3系統10種類です:
  • JPEG系3つ:JPEG, MozJPEG, Jpegli
  • 次世代JPEG系3つ:JPEG2000, JPEG XR, JPEG XL
  • 動画圧縮ツールを元にした系4つ:WebP, HEIC-x265, AVIF-AOM, AVIF-SVT

各種設定の説明は408説明すると無限にしないといけないので、抜粋して簡単に書きます。

JPEGなら、圧縮するための画像を間引くYUV420と間引かないYUV444で2種類あります。
また、圧縮するモードとしてスタンダードとプログレッシブがあり、それぞれに情報源符号化方法としてハフマン符号化、最適ハフマン符号化、算術符号化、JPEG-XLによるトランスコーディングによるANSなどがあります。
各ツールごとに最適化する方法がちょっとづつ違うので、JPEG, MozJPEG, Jpegliそれぞれで出力が違います。
MozJPEGに至っては、PSNR、SSIM、MS-SSIM、PSNR-HVSといった4つの評価指標用に最適化するモードすらあります。
これらを網羅的にに試すと90種類になります。

WebP、JPEG XL、HEIF、AVIFにはspeedやmethod、effortといったスイッチで10段階くらいで圧縮の複雑さを制御するスイッチがついています。
重たいけど圧縮できるものから最軽量で圧縮できるようにコントロールするものです。
また、WebPで導入されたYUV420 sharpという間引くときにちょっとだけ詳細が強調されるYUV420も使えるようになってます。

こういったものを、いろいろ集めて今は408種類で動かしています。

成果物

これをWebインターフェイスから確認できるようにしたのが冒頭に紹介したものです。
https://fukushimalab.github.io/spcp/

いろんな角度から画像圧縮した結果をグラフで表示できます。
マニュアルは冒頭にリンクがあります。
↓これ
image.png

できることは下記です。

  • データセットの選択
  • データセット内の画像の選択およびプレビュー
  • 408種類からのコーデックの選択
  • 画質評価軸を28種類から選択、横軸をbpp, QP、計算時間から選択
  • RD曲線表示、RD曲線の増分の表示、BD-rate vs 計算時間などの散布図として表示

アップロードしてあるデータは約3GBです。
画像は含まず、bppと評価指標、計算時間という計算結果だけをバイナリとして保存してgzip圧縮したものが3GBです。

RDカーブなどはすでに上記で示したので、計算時間 vs 画質評価のグラフや、BDレート vs 計算時間の散布図を示します。

圧縮時間(エンコード) vs 画質評価のグラフです。
JPEGがミリ秒単位なのに対してAVIFが最大10秒くらいかかってます。
黄色と灰色がAVIFで灰色のAVIFはSVTによる実装で高速ですが少し画質が悪いです。
次に遅いのはJPEG XLです。

image.png
図:圧縮時間 vs PSNR

圧縮時間(エンコード) vs 画質評価のx軸対数グラフです。
AVIFのせいで全然見えないので横軸を対数軸にしました。
これならどれくらい速いか比較しやすいでしょう。
色は途切れていますが、前のグラフと同じです。
なお、グラフがぶれてるのは諦めてます。10回平均とると計算完了まで3年くらいかかります。

image.png
図:圧縮時間(x軸対数) vs PSNR

なお、グラフのラベルで消したいプロットをクリックすると、該当ラベルに打消し線が入ってプロットから除外できます。

表示時間(デコード) の場合です。
エンコード時間と違って、違いは小さくどれもミリ秒単位です。
実用上は大差ありません。

image.png
図:表示時間 vs PSNR

BD-rate (PSNR) vs 計算時間の散布図です。
左下にあるほど高速で圧縮率と品質のトレードオフに優れています。
AVIFは計算時間は長いですがBD-rateに優れています。
いいところがないと言われていたJPEG2000は、高速性と性能に優れています。
なお、JPEG2000はブラウザ表示はほとんどできないです。

image.png
図:BD-rate(PSNR)と圧縮時間の散布図

BD-rate (SSIMURACLA2) vs 計算時間の散布図です。
最新の画質評価指標SSIMURACLA2(しみゅらくら2?発音わかりません)で同じようにグラフを作ります。
SSIMURACLA2は現状でかなり人間が見たときの画質を表す画像圧縮専用指標です。
JPEG XLのGitHubに、ツールが公開されています。
最初にsがついていないSIMURACLAはラテン語で幻影とか模倣とかを意味する単語です。
SSIMを拡張した指標になってます。
より、AVIFの性能が高いことが際立ちます。

image.png
図:BD-rate(SSIMURACLA2)と圧縮時間の散布図

次にJPEGだけでBD-rate (SSIMURACLA2) vs 計算時間の散布図を出してみましょう。
下の方にある(DB-rateが良い)のはすべてJpegliです。
MozJPEGは、普通のJPEG(libjpeg)よりは性能いいですが、Jpegliに品質で負けてます。
しかもJpegliのほうが速いです。

image.png
図:BD-rate(SSIMURACLA2)と圧縮時間の散布図(JPEGの場合)

まとめ

「画像圧縮ツールはどれがいいか問題」に決着をつけるために、力業でブルートフォースアタックした結果を紹介しました。

いろいろグラフをプロットして見ると、比較した範囲内では、AVIF(OpenCVでも使える)が性能が最も良さそうなことがわかりました。
しかも最近のブラウザならまずAVIFは表示できますし、表示するための復号時間も速いです。
(なお、圧縮する時間はJPEGの1000倍は超えてきます)
JPEGは、MozJPEGとかいろいろツールでてますが、Jpegliが性能良さそうです。
なお、OpenCVはデフォルトはlibjpegツールを使います。

いろいろプロットするとWebPは言うほど良くないということもわかります。
もしJPEGを無劣化で再圧縮できるJPEG XLがブラウザサポートされれば、これまでの資源そのままにWebPよりもよい性能で圧縮できたりします。

上記は、全部説明すると数十ページぐらいの情報が必要なのでざっくり説明しています。
説明不足な点があればコメントください。
(なんか解像度の高いディスプレイで表示すると表示グラフが巨大化する問題がでてるのでそのうち直します。)

この作業を通して痛感したこと:

「Windows updateが最大の敵」

なんどやつに計算をキルされたか...

235
146
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
235
146

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?