Codec-Vergleich
Vollständiger Messbericht: 14 unabhängige Fotos, drei Betriebspunkte, fünf Verfahren. Jede Baseline wurde auf exakt die Byte-Zahl von KARC getrimmt, erst danach wurde die Qualität...
Codec-Vergleich bei gleicher Byte-Zahl
Vollständiger Messbericht: 14 unabhängige Fotos, drei Betriebspunkte, fünf Verfahren. Jede Baseline wurde auf exakt die Byte-Zahl von KARC getrimmt, erst danach wurde die Qualität verglichen.
Erzeugt: 2026-08-13 09:49:37 · Testsatz: clic20v, 14 Bilder · Betriebspunkte: 3
Fragestellung
Wie viel Bildqualität liefern die Verfahren, wenn alle exakt gleich viele Bytes verbrauchen dürfen? Das ist die Frage, die in der Praxis zählt — nicht, wer bei frei gewählter Qualitätsstufe zufällig besser aussieht.
Methodik
- Jedes Bild wird mit KARC kodiert. Maßgeblich ist die echte Byte-Zahl aus der Datei, kein Schätzwert.
- Jede Baseline wird per Bisektion über ihre Qualitätsstufe auf genau diese Byte-Zahl getrimmt.
- Erst dann werden PSNR und MS-SSIM gegen das Original gemessen.
Genommen wird jeweils der Kandidat mit dem kleinsten Byte-Abstand zum Ziel — ober- wie unterhalb. Würde man „nie mehr Bytes als KARC" fordern, bekämen die Baselines bei grober Qualitätsstufung teils deutlich weniger Bytes und sähen künstlich schlechter aus.
Welche Byte-Zahl verglichen wird — und warum das hier entscheidend ist
Verglichen wird die reine Codec-Nutzlast, nicht die volle Dateigröße. Der
.karc-v2-Container enthält zusätzlich eine eingebettete Vorschau. Bei Bildern dieser
Größe ist die überraschend groß — siehe die Tabelle weiter unten. Nimmt man die volle
Datei als Ziel, bekommen die Baselines für die eigentlichen Bilddaten bis zu doppelt
so viele Bytes wie KARC; gemessen wird dann nicht mehr die Codec-Qualität, sondern der
Vorschau-Aufschlag.
Ein erster Durchlauf dieses Tests hatte genau diesen Fehler und ließ KARC dadurch gegen AVIF verlieren. Der Fehler fiel auf, weil die gemessene Bitrate deutlich über der aus dem offiziellen Benchmark lag — bei identischem PSNR.
Testsatz: clic20v — Bilder, auf denen das Modell nicht trainiert wurde.
Baseline-Einstellungen:
- AVIF —
Pillow/libaom speed=4 - WebP —
Pillow/libwebp method=6 - JPEG 2000 —
Pillow/OpenJPEG quality_mode=rates - JPEG —
Pillow/libjpeg optimize=True
Ergebnis
Mittelwerte über alle 14 Bilder. Δ = KARC minus Baseline, positiv bedeutet KARC besser.
Betriebspunkt λ = 0.0067 (im Mittel 0.3431 bpp, 37556 Byte je Bild)
| Verfahren | Ø Bytes | Ø PSNR | Ø MS-SSIM | Δ PSNR | Δ MS-SSIM | KARC besser bei |
|---|---|---|---|---|---|---|
| KARC | 37556 | 32.31 dB | 0.9762 | — | — | — |
| AVIF | 37330 | 30.71 dB | 0.9786 | +1.60 dB | -0.0024 | 14/14 Bildern |
| WebP | 37414 | 29.36 dB | 0.9683 | +2.95 dB | +0.0079 | 14/14 Bildern |
| JPEG 2000 | 37700 | 27.15 dB | 0.9240 | +5.16 dB | +0.0521 | 14/14 Bildern |
| JPEG | 37443 | 27.38 dB | 0.9487 | +4.92 dB | +0.0275 | 14/14 Bildern |
Betriebspunkt λ = 0.013 (im Mittel 0.4892 bpp, 53466 Byte je Bild)
| Verfahren | Ø Bytes | Ø PSNR | Ø MS-SSIM | Δ PSNR | Δ MS-SSIM | KARC besser bei |
|---|---|---|---|---|---|---|
| KARC | 53466 | 33.85 dB | 0.9850 | — | — | — |
| AVIF | 53881 | 32.21 dB | 0.9866 | +1.64 dB | -0.0016 | 14/14 Bildern |
| WebP | 53432 | 30.77 dB | 0.9796 | +3.08 dB | +0.0054 | 14/14 Bildern |
| JPEG 2000 | 53289 | 28.19 dB | 0.9422 | +5.66 dB | +0.0428 | 14/14 Bildern |
| JPEG | 53340 | 28.87 dB | 0.9692 | +4.98 dB | +0.0158 | 14/14 Bildern |
Betriebspunkt λ = 0.025 (im Mittel 0.6626 bpp, 72353 Byte je Bild)
| Verfahren | Ø Bytes | Ø PSNR | Ø MS-SSIM | Δ PSNR | Δ MS-SSIM | KARC besser bei |
|---|---|---|---|---|---|---|
| KARC | 72353 | 35.38 dB | 0.9902 | — | — | — |
| AVIF | 73178 | 33.55 dB | 0.9913 | +1.83 dB | -0.0011 | 14/14 Bildern |
| WebP | 72518 | 32.23 dB | 0.9862 | +3.15 dB | +0.0040 | 14/14 Bildern |
| JPEG 2000 | 72501 | 29.30 dB | 0.9557 | +6.09 dB | +0.0345 | 14/14 Bildern |
| JPEG | 72450 | 30.19 dB | 0.9810 | +5.19 dB | +0.0091 | 14/14 Bildern |
Nebenbefund: die eingebettete Vorschau ist zu groß
Beim Aufsetzen dieses Tests fiel auf, wie viel des .karc-Containers gar nicht auf
die Bilddaten entfällt:
| Anteil der Vorschau an der Gesamtdatei | |
|---|---|
| Mittel | 34.5 % |
| Kleinster Wert | 11.8 % |
| Größter Wert | 82.1 % |
Im Mittel entfällt also gut ein Drittel der Datei auf ein Vorschaubild, im Extremfall über vier Fünftel — dort ist die eigentliche Bildinformation nur noch ein Sechstel der Datei. Der Effekt trifft kleine Dateien am härtesten, weil die Vorschau kaum mit der Bitrate schrumpft.
Für die Codec-Bewertung ist das irrelevant. Für die Produktgröße ist es der mit Abstand größte Hebel, den dieser Testlauf zutage gefördert hat — und er wirkt sofort, unabhängig von jeder Modellverbesserung.
Wie genau wurde die Byte-Zahl getroffen?
| Verfahren | Ø |Abweichung| | größte Abweichung | |---|---:|---:| | AVIF | 1.90 % | 4.64 % | | WebP | 0.62 % | 1.81 % | | JPEG 2000 | 0.57 % | 1.98 % | | JPEG | 1.23 % | 4.16 % |
Die Qualitätsstufen der Baselines sind ganzzahlig; ein exakter Byte-Treffer ist
deshalb nicht immer möglich. Die tatsächlich erreichte Byte-Zahl steht bei jedem
Messwert in daten/messwerte.json und auf jeder Vergleichstafel.
Geschwindigkeit (KARC, CPU)
Kodieren im Mittel 5.6 s, Dekodieren 5.5 s je Bild. Der Codec lief hier bewusst auf der CPU, damit parallel ein GPU-Training ungestört weiterlaufen konnte.
Einzelmessungen, Betriebspunkt λ = 0.013
Damit jede Mittelwert-Angabe oben nachrechenbar ist — PSNR in dB je Foto und Verfahren:
| Foto | Byte (Bilddaten) | KARC | AVIF | WebP | JPEG 2000 | JPEG |
|---|---|---|---|---|---|---|
| clic20v_01 | 19867 | 36.27 | 34.71 | 33.12 | 31.51 | 30.19 |
| clic20v_02 | 124442 | 29.73 | 28.55 | 27.13 | 24.59 | 25.55 |
| clic20v_03 | 58120 | 33.85 | 31.71 | 29.83 | 25.87 | 27.68 |
| clic20v_04 | 62103 | 32.55 | 30.25 | 28.95 | 27.72 | 27.61 |
| clic20v_05 | 47825 | 34.97 | 32.61 | 30.62 | 26.89 | 28.32 |
| clic20v_06 | 25791 | 36.12 | 34.62 | 33.67 | 31.39 | 31.69 |
| clic20v_07 | 90667 | 31.55 | 30.44 | 29.70 | 27.29 | 28.61 |
| clic20v_08 | 75009 | 30.60 | 29.55 | 28.48 | 25.40 | 27.17 |
| clic20v_09 | 38873 | 34.83 | 33.89 | 32.25 | 28.11 | 30.53 |
| clic20v_10 | 70803 | 31.85 | 29.89 | 28.28 | 27.34 | 27.07 |
| clic20v_11 | 4283 | 37.10 | 34.81 | 33.77 | 31.13 | 31.10 |
| clic20v_12 | 55758 | 33.34 | 31.70 | 30.23 | 29.03 | 29.18 |
| clic20v_13 | 16901 | 37.87 | 36.55 | 34.10 | 30.99 | 30.59 |
| clic20v_14 | 58080 | 33.28 | 31.71 | 30.64 | 27.44 | 28.90 |
Was in diesem Ordner liegt
| Pfad | Inhalt |
|---|---|
vergleichstafeln/ |
Eine A4-Tafel je Bild und Betriebspunkt (quer, 300 dpi, druckfertig) |
bilder/ |
.karc-Dateien und dekodierte PNGs einer Auswahl |
daten/messwerte.json |
Alle Einzelmessungen mit Methodik-Vermerk |
daten/messwerte.csv |
Dieselben Daten als Tabelle |
Dateibenennung der Tafeln:
<datensatz>_<nr>_mse-l<lambda>_ausschnitt_x<X>-y<Y>-<kante>px_A4quer300dpi.png
x/y ist die Position des gezeigten Ausschnitts im Originalbild, kante seine
Größe in Bildpunkten. Der Ausschnitt wird automatisch dorthin gelegt, wo das Bild
am detailreichsten ist — ein fester Mittenausschnitt trifft sonst oft Himmel oder
Unschärfe und zeigt zwischen den Verfahren gar nichts.
Neu erzeugen
python samples/tests/vergleich_lauf.py --out samples/tests/<datum>_codecvergleich \
--lambdas 0.0067,0.013,0.025
python samples/tests/vergleich_bericht.py --lauf samples/tests/<datum>_codecvergleich