Effektivere verlustfreie Komprimierung für TIFF

8

Ich versuche, TIFF-Bilder in einer Datenbank zu archivieren, und ich möchte die Bilder so viel wie möglich komprimieren, selbst auf Kosten einer höheren CPU-Auslastung und eines hohen Speichers.

Um die in LibTiff.NET verfügbaren Komprimierungen zu testen, habe ich den folgenden Code verwendet (modifiziert von dieses Beispiel ):

%Vor%

Das Testbild ist 200dpi 24bpp, 1700 Breite mal 2200 Höhe und LZW-Komprimierung; Die Dateigröße beträgt fast 7 MB. (Das Bild ist repräsentativ für die Bilder, die ich speichern möchte.)

Von den Algorithmen, die funktioniert haben ( einige Fehler mit verschiedenen Fehlern ), die kleinste komprimierte Datei wurde mit Compression.Deflate erstellt, aber nur auf 5MB komprimiert, und ich möchte sie deutlich kleiner (unter 1 MB).

Es muss einen Algorithmus für eine höhere Komprimierung geben; Eine PDF-Datei mit diesem Bild ist etwa 500Kb.

Wenn ein bestimmter Algorithmus nicht mit anderen TIFF-Viewern / Bibliotheken kompatibel ist, ist dies kein Problem, solange wir das komprimierte TIFF aus der Datenbank extrahieren und es mit LibTiff.Net oder einer anderen Bibliothek in ein System.Drawing.Bitmap konvertieren können .

Wie kann ich noch kleinere Dateien mit verlustfreier Komprimierung erzeugen? Ist das mit diesen Bildern überhaupt möglich?

Aktualisieren

PDF-Datei
TIFF-Datei

    
Zev Spitz 26.09.2016, 20:52
quelle

3 Antworten

1

Zwei Teile zur Antwort:

  • Machen Sie es auf eine Weise verlustbehaftet, wie Sie es wählen, und nicht so, wie es ein verlustreicher Codec tut. Wenn Sie beispielsweise mit gescannten Textbildern arbeiten, führen Sie eine Helligkeits- / Kontrastnormalisierung (möglicherweise lokale Normalisierung) durch, sodass der Seitenhintergrund rein weiß ist. Dies wird die Kompressibilität um einiges verbessern; es könnte eine 10MB Graustufentextseite mit fast, aber nicht genau weißem Hintergrund in eine 200kB Seite mit reinem weißem Hintergrund und Graustufentext (unter Verwendung von LZW)

  • machen
  • Verwenden Sie JPEG2000. Wenn Sie eine bestmögliche verlustfreie Komprimierung wünschen, wird JPEG2000 mit verlustfreien Einstellungen wahrscheinlich jeden anderen Algorithmus wie PNG übertreffen, insbesondere für Inhalte wie Fotos, aber auch für gescannte Seiten. Speichern Sie Ihre JPEG2000 in TIFF-Containern sollte auch möglich sein, aber es ist nicht eine sehr häufige Funktion von TIFF-Bibliotheken; Sie können oder wollen nicht das tun. Ich denke JPEG2000 hat eine Funktion für mehrere Bilder in einer Datei.

Alex I 03.10.2016 02:14
quelle
1

Einfache Auswertung des Testbildes

Nur um ein paar Zahlen auf dem Beispielbild zu geben (das Tiff). Alle Komprimierungen sind verlustfrei und können jedes andere verlustfreie Format wie bmp / ​​png (welches überprüft wurde) neu erstellen.

%Vor%

Bemerkungen

  • Dies sind nur die Ergebnisse eines Bildes
    • Die meisten davon haben noch potenzielle Gewinne, aber für die Komprimierung ist dann eine Menge Zeit erforderlich
    • Während die allgemeine Beobachtung (in Bezug auf die Anordnung der Kompressionseffizienz dieser Kompressoren) gelten sollte, werden sich die Werte für ein größeres Testset ändern
  • Die meisten dieser Kompressoren wurden nur für die Verarbeitung von Einzelbildern entwickelt
    • Es wäre eine leichte Aufgabe, den Multi-Tiff in einzelne zu teilen; jeweils komprimieren; Speichern Sie die Verbindungen irgendwie
    • Dies ist auch sehr natürlich in einem DB-Setup
    • Wenn diese Multi-TIFF-Bilder stark korreliert sind, könnte dies möglich sein (z. B. Allzweckkompressoren oder ein benutzerdefinierter Ansatz)
  • Wie in den Kommentaren angegeben, ist die Art der gewünschten Reduzierung für die meisten Arten von Bildern (z. B. Fotos oder Scans; Einhaltung verlustfreier Komprimierung) nicht möglich.
    • Es gibt viel zu erzählen, aber der wichtigste Aspekt ist: Sie enthalten viel Rauschen und Rauschen kann nicht komprimiert werden

Zum Spaß: Denoise + Lossless-Kompression

Da Rauschen der wichtigste Faktor ist, um verlustfreie Kompressionspotentiale zu eliminieren, lassen Sie uns einige entfernen. Wir machen das mit diesem Python-basierten Code, aber es gibt viel mehr mögliche Ansätze. Der folgende Code verwendet einen nichtlinearen Filter, der versucht, Rauschen zu entfernen, während wichtige Kanten beibehalten werden.

Natürlich sind hier Informationen verloren, aber ich mag das geraubte Bild eher, weil es (meiner Meinung nach) schöner zu lesen ist.

Code für Rauschunterdrückung

%Vor%

Auswertung

%Vor%

    
sascha 09.10.2016 11:04
quelle
0

Lesen Sie die G4-Komprimierungsmethode: Ссылка

Im Durchschnitt gibt Ihnen diese Methode ein Komprimierungsverhältnis von 20: 1.

Hier ist ein C # -Beispiel (credits to: Ссылка ):

%Vor%     
Deian 06.10.2016 14:03
quelle

Tags und Links