これまではguetzliの入力画像として写真データを用いてきましたが、本投稿では写真以外の画像データで検証を行います。また、定性的な評価のみならず、定量的な評価も行います。
はじめに
Test Data: Screen Shot (PC small dialog)
Input Data Spec
- Resolution
- 482x165
- Bit depth
- 8bit
- Color space
- sRGB
- Compression
- ZIP
Result
Condition | Size [Bytes] | CompressionRatio | Entropy of difference | Mean of difference | Max of difference |
---|---|---|---|---|---|
original PNG | 7,553 | 100% | - | - | - |
guetzli Q84 | 24,739 | 328% | 0.228286 | 258.052 | 36237 |
guetzli Q100 | 43,924 | 582% | 0.121733 | 18.6327 | 5654 |
libjpeg Q84 | 14,210 | 188% | 0.330291 | 824.776 | 40606 |
libjpeg Q100 | 44,728 | 592% | 0.117031 | 10.805 | 1028 |
Test Data: Screen Shot (PC medium dialog)
Input Data Spec
- Resolution
- 465x574
- Bit depth
- 8bit
- Color space
- sRGB
Result
Condition | Size [Bytes] | CompressionRatio | Entropy of difference | Mean of difference | Max of difference |
---|---|---|---|---|---|
original PNG | 11,826 | 100% | - | - | - |
guetzli Q84 | 41,212 | 348% | 0.173277 | 173.501 | 35209 |
guetzli Q100 | 78,635 | 665% | 0.0817355 | 6.97055 | 1028 |
libjpeg Q84 | 25,394 | 215% | 0.223223 | 429.799 | 34181 |
libjpeg Q100 | 79,058 | 669% | 0.0712689 | 5.38406 | 771 |
Test Data: Screen Shot (Android)
Input Data Spec
- Resolution
- 720x1280
- Bit depth
- 8bit
- Color space
- sRGB
Result
Condition | Size [Bytes] | CompressionRatio | Entropy of difference | Mean of difference | Max of difference |
---|---|---|---|---|---|
original PNG | 155,121 | 100% | - | - | - |
guetzli Q84 | 123,757 | 80% | 0.361009 | 401.834 | 19532 |
guetzli Q100 | 226,399 | 146% | 0.410174 | 118.969 | 2056 |
libjpeg Q84 | 116,859 | 75% | 0.370609 | 386.882 | 29555 |
libjpeg Q100 | 351,144 | 226% | 0.404799 | 80.8539 | 1285 |
Test Data: Graph (plot)
Input Data Spec
- Resolution
- 660x660
- Bit depth
- 8bit
- Color space
- sRGB
Result
Condition | Size [Bytes] | CompressionRatio | Entropy of difference | Mean of difference | Max of difference |
---|---|---|---|---|---|
original PNG | 15,127 | 100% | - | - | - |
guetzli Q84 | 146,756 | 970% | -1.#IND | 372.867 | 65535 |
guetzli Q100 | 292,826 | 1936% | 0.082529 | 15.2432 | 10794 |
libjpeg Q84 | 105,573 | 698% | -1.#IND | 482.193 | 65535 |
libjpeg Q100 | 294,624 | 1948% | 0.128855 | 10.6173 | 771 |
Test Data: Logo
※けものフレンズ ロゴジェネレータを使用しています。
Input Data Spec
- Resolution
- 510x350
- Bit depth
- 8bit
- Color space
- sRGB
Result
Condition | Size [Bytes] | CompressionRatio | Entropy of difference | Mean of difference | Max of difference |
---|---|---|---|---|---|
original PNG | 70,404 | 100% | - | - | - |
guetzli Q84 | 29,180 | 41% | -1.#IND | 433.499 | 65535 |
guetzli Q100 | 57,373 | 81% | -1.#IND | 271.489 | 65535 |
libjpeg Q84 | 26,275 | 37% | -1.#IND | 503.821 | 65535 |
libjpeg Q100 | 80,050 | 114% | -1.#IND | 200.869 | 65535 |
Consideration
- オリジナルのPNGはアルファチャネル付き透過PNGであるが、(libjpeg/guetzliに依らず)JPEG化のためアルファ情報は失われる。
- Quality 100同士の比較ではguetzliが有意に高圧縮率を達成しているが、差分の平均値はlibjpegより大きいことから、定量的には画質劣化も大きいと判断できる。
- Quality 100同士を目視確認すると画質差異は全く感じられないが、差分画像を参照するとそれぞれエッジ部分が変化していることが判る。
- Quality 84同士の比較では転じてlibjpegの方が高圧縮率を達成するが、差分の平均値はguetzliの方が小さく、画質劣化はguetzliの方が定量的に少ないと判断できる。
- 元も子もない話だが、オリジナルのPNGをzlib圧縮レベル9でアダプティブフィルタを指定してPNGファイルのまま可逆圧縮すると56,678byteに圧縮できた。このファイルサイズと比較すると、Quality 100ではguetzliもlibjpegもオリジナルよりファイルサイズが増えており、JPEG化する意味が無い。
まとめ
これまでの検証も踏まえると、写真や細かい文字や図表を含む画像においては、guetzliを使う理由は見当たりません。
ですが、guetzliが有効かもしれないと思えるサンプルが今回初めて見つかりました。LogoサンプルのQ100の場合のみですが。とは言え、PNG自体を適切に可逆圧縮した方が小さくなるというデータパターンでしたので、やはり積極的にguetzliを導入する理由が見当たりません。
それでもこの画像の特性を他の画像と比較すると、グラデーションや中間色が無く、細かいテクスチャも無く、単色のベタ塗り領域が大きい画像といった特徴になるかと思います。このような画像の場合にはguetzliが効果を発揮するのかもしれないですね(同時にハフマン圧縮やzlib圧縮の効果が出やすいパターンであり、PNG自体を圧縮することを試みた方が良さそうでもあります。PNG圧縮についてはこちらに記載しています)。
以上。