RGB zu YCbCr



  • 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. 🙂
    Ich finde es ein wenig verwirrend, da man drei Zahlen bei der Rechnung braucht. In einem JPEG hab ich aber nur ganz viele Zahlen hintereinander.(Mal einfach gesagt) Naja und wenn ich nun diese Rechnung mache frage ich mich immer welche ich da benutzen muss.
    Beispiel:

    d8 12 f4 ...
    

    Nehme ich nun die drei und setze sie hier so ein:

    newPixel.Y = 0.299 * d8 + 0.587 * 12 + 0.114 * f4;
    newPixel.Cb = - 0.168736 * d8 - 0.331264 * 12 + 0.5 * f4+ 128.0;
    newPixel.Cr = 0.5 * d8 - 0.418688 * 12 - 0.081312 * f4 + 128.0;
    

    oder mach ich es so das ich nur eine nehme und so einsetze:

    newPixel.Y = 0.299 * d8 + 0.587 * d8 + 0.114 * d8;
    newPixel.Cb = - 0.168736 * d8 - 0.331264 * d8 + 0.5 * d8 + 128.0;
    newPixel.Cr = 0.5 * d8 - 0.418688 * d8 - 0.081312 * d8 + 128.0;
    

    Vielleicht habe ich auch noch ein denk Fehler. Ich hab jetzt HEX Zahlen genommen hatte keine lust in DEZ umzurechnen sry. 🙂



  • Zu RGB gehoeren meist drei Zahlen! 🙄



  • knivil schrieb:

    Zu RGB gehoeren meist drei Zahlen! 🙄

    Ok aber stehen die 3 einfach hintereinander? Das sollte die Frage sein. 😃



  • Das haengt vom Datenformat ab, aber meistens Ja. Auch kommt es drauf an, ob RGB oder BGR abgespeichert wird.



  • knivil schrieb:

    Das haengt vom Datenformat ab, aber meistens Ja. Auch kommt es drauf an, ob RGB oder BGR abgespeichert wird.

    Ah ok das bringt endlich Licht in die Sache. 🙂

    Wie bekomme ich den raus ob RGB oder BGR?



  • Nun, nicht aus den 3 Zahlen selber. Das sind Metainformation und sollten im Header bzw. in der Formatbeschreibung zu finden sein.



  • neben RGB und BGR gibt es noch eine ganze Reihe andere Formate

    http://www.fourcc.org/rgb.php
    http://www.fourcc.org/yuv.php



  • Fuchs aus dem Wald schrieb:

    knivil schrieb:

    Das haengt vom Datenformat ab, aber meistens Ja. Auch kommt es drauf an, ob RGB oder BGR abgespeichert wird.

    Ah ok das bringt endlich Licht in die Sache. 🙂

    Wie bekomme ich den raus ob RGB oder BGR?

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



  • 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.



  • Fuchs aus dem Wald schrieb:

    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.

    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.



  • 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.



  • 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.


Anmelden zum Antworten