RGB zu YCbCr



  • Ok, also wenn du nach JPEG codieren moechtest, dann musst du zuerst nach YUV transformieren. Nun, wie du auf die einzelnen Pixel deines Rohdatenbildes zugreiffst, dass haengt von deiner Datenstruktur ab. Welche Datenstruktur hast du denn fuer "normale" Bilder?



  • Fuchs aus dem Wald schrieb:

    CreativeLabs schrieb:

    Wenn es möglich wäre direkt auf die Pixel (in welchem Farbraum auch immer) zuzugreifen, wäre JPEG ja nicht komprimiert. Du musst diesen Bytemüll erst dekodieren um an die Pixel ranzukommen.

    Ok macht Sinn. D.h. die Stichpunkte dadrunter sind der absolute mist. Die Grafik ist aber richtig.

    Nein Du verwechselst die Reihenfolge. Die Stichpunkte geben die Schritte bei der Kodierung an, so wie ich das verstanden habe willst Du aber eine Dekodierung.
    Also: Du hast ein JPEG, willst es einlesen und den Farbraum ändern. Korrekt? Dann musst Du Dich durch die JPEG-Spec wühlen und die ganze Drecksarbeit des Dekodierens implementieren. Oder: Du verwendest einfach eine fertige Lib. JPEG sind nicht ohne und können auch erfahrenere Programmierer eine Weile beschäftigen.



  • Ich fange mit einem JPEG an aber das liegt in einem Vector.



  • Fuchs aus dem Wald schrieb:

    CreativeLabs schrieb:

    Du liest momentan die rohen Bytes eine JPEGs und hast Doch noch garnicht um die Dekodierung gekümmert, stimmts?
    So wird das nichts.

    Hmm ..
    Schau dir mal bitte das hier an:
    http://goethe.ira.uka.de/seminare/redundanz/vortrag11/

    Wenn ich mir dann bei dem Unterpunkt Verlustbehaftete Kompression das Bild angucke und die Stichpunkte dadrunter, denke ich ich soll mit dem Farbraum anfangen.

    In dem Bild im Vortrag geht es um die Kompression, also die Erzeugung eines
    JPG-Bildes.

    CreativeLabs spricht von er Dekodierung, also dem entgegengesetzen Vorgang - du möchtes ein "echtes" Bild erzeugen, hast aber nur ein JPG.

    edit: zu laaaaaangsam...



  • CreativeLabs schrieb:

    Nein Du verwechselst die Reihenfolge. Die Stichpunkte geben die Schritte bei der Kodierung an, so wie ich das verstanden habe willst Du aber eine Dekodierung.
    Also: Du hast ein JPEG, willst es einlesen und den Farbraum ändern. Korrekt? Dann musst Du Dich durch die JPEG-Spec wühlen und die ganze Drecksarbeit des Dekodierens implementieren. Oder: Du verwendest einfach eine fertige Lib. JPEG sind nicht ohne und können auch erfahrenere Programmierer eine Weile beschäftigen.

    Also mein gesamt Projekt soll Dekodieren und Enkodieren. Also beides. Allerdings fange ich mit einem JPEG an. Also ich lese erst ein JPEG ein.
    Wenn ihr wollte kann ich euch den Aufbau von dem JPEG zeigen. (Hier)



  • Fuchs aus dem Wald schrieb:

    Also mein gesamt Projekt soll Dekodieren und Enkodieren. Also beides. Allerdings fange ich mit einem JPEG an. Also ich lese erst ein JPEG ein.
    Wenn ihr wollte kann ich euch den Aufbau von dem JPEG zeigen. (Hier)

    Gut. Dann weißt Du ja jetzt wie Du vorgehen musst 😃



  • Danke. 😃



  • Fuchs aus dem Wald schrieb:

    Vielen dank für die ganzen tollen antworten.

    @Ethon du verwechselst mich nicht. 😉

    hustbaer schrieb:

    Farbraum-Umwandlung kommt erst ganz zum Schluss.

    Erst musst du mal das JPEG-File-Format parsen, und dir die einzelnen Informationsstücke zusammensuchen.
    Dann kannst du mal anfangen die Bilddaten zu dekomprimieren.
    D.h. - wenn ich es richtig im Kopf habe - erstmal Huffman dekodierung, dann zig-zag Scan, Multiplikation mit dem Quantizer und dann inverse DCT. Und das halt für jeden Block.

    DANN erst hast du ein Bild im YUV Format vorliegen. Und das kannst du dann nach RGB konvertieren.

    Wenn du dich schon seit 3 Monaten damit beschäftigst solltest du das aber alles längst wissen.

    Ja das sagt mir auch alles was, hab auch schon einiges davon umgesetzt. Nur das einzige was ich halt noch nicht ganz verstanden hatte war das mit dem Farbraum. 🙂

    Du hast davon - wie aus deinen folgenden Antworten ersichtlich ist - anscheinend nicht viel verstanden und sicher noch nichts umgesetzt.

    BTW: einen Punkt hab ich vergessen: Chroma-Subsampling.
    Bei den meisten JPEGs sind die Farbkanäle mit der halben horizontalen und der halben vertikalen Auflösung abgespeichert.
    D.h. man muss erstmal die Farbkanäle auf volle Auflösung aufblasen bevor man dann YUV -> RGB rechnen kann.

    Fang doch erstmal damit an dir die passenden Blöcke zu suchen, und lies dir die Beschreibung dieser Blöcke durch. Und dann implementier die nötigen Transformationen Schritt für Schritt.

    Und google dir ein paar zusätzliche Quellen. Gibt genug Informationen zum Aufbau von JPEGs im Internet.



  • hustbaer schrieb:

    Fang doch erstmal damit an dir die passenden Blöcke zu suchen, und lies dir die Beschreibung dieser Blöcke durch. Und dann implementier die nötigen Transformationen Schritt für Schritt.

    Und google dir ein paar zusätzliche Quellen. Gibt genug Informationen zum Aufbau von JPEGs im Internet.

    Ich hab das JPEG schon in einem vector und die einzelnen Blöcke (SOS, DQT, DHT...)mir gesucht. Ich hab auch schon die Tabellen raus geschrieben und Huffman gemacht. Und durch die Infos hier weiß ich jetzt was ich machen muss.

    Danke dafür.



  • OK, cool.

    Lass uns wissen wie du vorankommst.



  • Hab mir jetzt mal ein vernünftigen Ablauf aufgeschrieben.

    Schaut drüber und korrigiert mich wenn es falsch ist. 🙂

    Ablauf



  • Chroma-Kanäle aufblasen (Chroma-Subsampling entfernen) fehlt noch.
    Ansonsten: ich bin jetzt auch nicht der grosse JPEG Experte. Ich weiss gerade ein wenig darüber wie ein JPEG File ca. aufgebaut ist, implementiert hab ich es selbst auch noch nie.

    Ob deine Liste genau passt kann ich dir also auch nicht sagen. Nach meinem Kenntnisstand beurteilt würde ich aber sagen: sieht gut aus.



  • hustbaer schrieb:

    Chroma-Kanäle aufblasen (Chroma-Subsampling entfernen) fehlt noch.

    Ist doch Punkt 3. 😃
    Chroma-Subsampling ist Farbunterabtastung. Und in Punkt drei schaue ich welches Abtastformat benutzt wurde.
    EDIT:
    D.h. wenn ich 4:2:0 habe habe ich 4 Y-8x8-Blöcke und jeweils ein Cb-8x8-Block und ein Cr-8x8-Block. Die sind auch genau in der Reihenfolge Codiert. D.h. eine ich sag mal "Einheit" hat dann 6 8x8-Blöcke.



  • Mal eine Frage:
    Die Quantisierung-Tabelle steht die im Zick-Zack da oder kann ich die einfach so weg schreiben, also einfach in ein 2-Dim. Array?
    Stehen tut sie ja ab dem Marker FF DB.



  • Wie gesagt, ich auch kein JPEG Experte, so genau kann ich dir das auch nicht sagen.
    Und ... ähäm ... "Farbunterabtastung", ja, wenn ich das hätte lesen können hätt ich's vermutlich verstanden 🙂

    Wie die einzelnen Blöcke der Farbkanäle angeordnet sind weiss ich nicht. Im Prinzip kannst du aber erstmal jeden Kanal einzeln dekodieren, und dann den kompletten Kanal mit voller Grösse aufblasen.
    (EDIT: gibt beide Varianten, entweder alle Blöcke eines Kanals hintereinander und dann erst der nächste Kanal, oder auch "interleaved".)

    Ich weiss nicht ob der JPEG Standard einen Filter zum Aufblasen definiert, bzw. definiert ob man die Blöcke einzeln aufblasen soll oder das Bild als ganzes. Wenn ja, dann halte dich am besten an diese Vorgaben.
    (EDIT: sieht so aus als ob der Standard keinen Filter definiert.)

    Wenn nein, dann würde ich empfehlen das Aufblasen erst mit dem ganzen Bild zu machen (vor bzw. gleichzeitig mit der YUV->RGB Konvertierung), weil es vermutlich zu nem besseren Ergebnis führen wird. Wenn du nämlich die einzelnen Blöcke aufskalierst, dann musst du entweder einen suboptimalen Vergrösserungsfilter verwenden (nearest pixel oder linear interpolieren), oder du bekommst Fehler an den Blockrändern -- weil du dort die von besseren Filtern (bikubisch, ...) benötigen Nachbarpixel nicht zur Verfügung hast. Diese Fehler würden sich dann wie ein Gitter durch das ganze Bild ziehen. Bei Bildern mit starken Farbübergängen (roter Text auf Schwarz, grüner Text auf Rot o.ä.) würde das ziemlich sicher auch auffallen.

    Wie die Quantisierungs-Matrix abgelegt ist weiss ich ehrlich gesagt auch nicht. Ich würde vermuten ohne zig-zag. Kannst du aber einfach an den Werten erkennen: wenn sie halbwegs von klein nach gross sortiert sind, dann ist es mit zigzag. Wenn sie dagegen eher ne Sägezahnkurve ergeben, dann ist es ohne zigzag.

    Oder du suchst dir die fehlenden Infos aus den entsprechenden Standarddokumenten raus:
    http://www.w3.org/Graphics/JPEG/itu-t81.pdf
    http://www.w3.org/Graphics/JPEG/jfif3.pdf



  • Hey hustbaer,
    vielen dank für deinen Beitrag! Sehr hilfreich!

    Ich schau mir das gleich mal und danke für die 2 Links die hatte ich noch nicht. 😞

    Ich meld mich dann Donnerstag wieder hab jetzt erstmal Feierabend! 😃

    Schönen 1. Mai euch!



  • Fuchs aus dem Wald schrieb:

    Ich schau mir das gleich mal und danke für die 2 Links die hatte ich noch nicht. 😞

    Sind beide auf der (englischen) Wikipedia-Seite zu JPEG zu finden 😉

    http://en.wikipedia.org/wiki/JPEG

    Tip: Browser umstellen dass er Englisch als erste Sprache meldet und Google umstellen dass google.com verwendet wird und "Google-Anwendungen" auch per Default Englisch laufen.
    Bringt eine deutliche Verbesserung der Suchresultate bei fast allen Themen, und sorgt bei einigen Seiten dafür dass man nicht per Default auf die (meist minderwertige) Deutsche Seite umgeleitet wird. (Bzw. bei MSDN per Default die (meist minderwertige) Deutsche Sprachversion presentiert bekommt.)

    Ausgenommen natürlich wenn man nach Deutsch-spezifischen Dingen sucht. Wobei Google schlau genug zu sein scheint mir trotzdem nicht nur lauter amerikanische Online Shops zu liefern wenn ich nach Produkten suche.



  • hustbaer schrieb:

    Tip: Browser umstellen dass er Englisch als erste Sprache meldet

    Gute Idee, habe ich auch schonmal versucht... nutze Firefox, und es wollte nicht klappen. Falls du auch Firefox nutzt, wie macht man das? Ich habe z.B. in \1:config Language auf en-us umgestellt, hat aber net so viel gebracht.



  • out schrieb:

    ... nutze Firefox, und es wollte nicht klappen.

    http://www.google.com/ncr



  • ncr schrieb:

    out schrieb:

    ... nutze Firefox, und es wollte nicht klappen.

    http://www.google.com/ncr

    😮 Wie einfach Dinge doch sein können... 3 Buchstaben.

    Danke dir 🙂


Anmelden zum Antworten