Gibt es eine Möglichkeit, JPEG mit einer bestimmten Bitrate zu kodieren?
Momentan verwende ich imagemagicks convert
:
Bitrate erhöht sich mit Qualität, aber es ist nicht linear. Ich möchte die Bitrate explizit kontrollieren. Es muss nicht genau sein, aber ich möchte es einigermaßen schließen (innerhalb von sagen wir 0,1 Bpp der angegebenen Einstellung).
Gibt es dort einen Encoder, der Bilder mit einer bestimmten Bitrate codiert? Es muss nicht imagemagick sein, ich nehme was auch immer funktioniert (vorzugsweise unter Linux).
Eine dumme Möglichkeit wäre, mit dem Parameter -quality
mit Bruchwerten herumzuspielen, bis etwas in der Nähe der Zielbitrate herauskommt, aber ich hoffe auf eine elegantere Lösung.
BEARBEITEN:
Ich wurde also gelangweilt und beschloss, die Dinge schnell (aber dumm) zu machen.
Hier ist ein Graph von imagemagicks -quality
vs Bitrate:
Übrigens, hier ist das Bild, das ich benutzt habe:
Die Änderung der Bitrate ist also ziemlich gut für niedrigere Qualitätswerte, wird aber nach etwa 80 grob.
Hier ist ein Beispielcode, um ein Bild bei einer Zielbitrate zu kodieren. Ich habe OpenCV verwendet, weil es die speicherinterne JPEG-Kodierung ermöglicht (keine E / A erforderlich). Während ich dies ursprünglich mit Python mockte, stellen die Python OpenCV-Wrapper die In-Memory-Encoding-Funktionalität leider nicht zur Verfügung. Also habe ich es in C ++ geschrieben.
Zu guter Letzt dachte ich an eine lineare Interpolation der Qualität, um näher an die Zielbitrate zu kommen, aber da cv::imencode
nur ganzzahlige Parameter akzeptiert, ist es nicht möglich, eine nicht ganzzahlige JPEG-Qualität einzustellen. Die Qualitätsskala zwischen OpenCV und imagemagick scheint sich ebenfalls etwas zu unterscheiden, so dass die interpolierten Qualitätsparameter von OpenCV und die Verwendung von% inmagagicks convert
nicht gut funktionierten.
Dies bedeutet, dass die Ausgabe-Bitrate nicht gleich der Ziel-Bitrate ist, insbesondere bei höheren Bitraten (& gt; 1). Aber es ist nah.
Kann jemand etwas besseres vorschlagen?
Code:
%Vor%Kompilieren und ausführen mit:
%Vor%Ich weiß, dass es eine Menge Arbeit gibt, die Ausgabebitrate eines JPEG-Encoders zu steuern (zB 1. Papier ; < a href="http://ieeexplore.ieee.org/Xplore/login.jsp?url=http://ieeexplore.ieee.org/iel1/30/4057/00156759.pdf%3Farnumber%3D156759&authDecision=-201 "> 2. Papier ), und dass solche Steuerelemente in JPEG2000 vorhanden sind. Leider bin ich mir nicht sicher, ob irgendeine Art von Bitratensteuerung für JPEG standardisiert oder in allgemeinen Bibliotheken implementiert ist. Sie müssen möglicherweise Ihre eigene Methode codieren, indem Sie eine Art von binärer Suche für Beispiel verwenden ...
Aber wieder kann ich mich irren - und wenn ja, würde ich gerne von einer solchen Bibliothek hören.
Nur aus Neugier, welche Sprache benutzen Sie?
Das Bitrate-Qualitätsverhältnis in JPG ist ziemlich abhängig vom Inhalt. Wenn Sie mit einer bestimmten Bitrate codieren möchten, schlage ich vor, dass Sie zwei Durchgänge machen: 1. Kodieren Sie mit einem festen Qualitätsfaktor (näher an Ihrer Zielbitrate ist besser, könnte auf Ihrem Diagramm basieren) 2. Geben Sie das Original basierend auf seiner Größe in einer höheren oder niedrigeren Qualität wieder. Auch dies kann auf Ihrem Diagramm oder etwas Ähnlichem basieren.
Sie können den letzten Schritt auch unbegrenzt wiederholen, um die GENAUE Bitrate zu erhalten, die Sie brauchen.
Ich würde das mit verschiedenen extremen Fällen testen, wie einem sehr lauten / belebten Bild, einem schwarzen Rechteck oder einem glatten Verlauf.
Tags und Links opencv image-processing compression imagemagick jpeg