RGB zu YCbCr



  • Hey Leute,
    vor weg:
    Ich werde ab jetzt diesen Thread hier benutzen da ich ja einen neuen Namen hier im Forum habe.

    So nun zu meinem Problem.
    Es geht um das JPEG. Dieses soll decodiert und encodiert werden. Aber ich zerbreche mir im Moment den Kopf über die Farben.

    Was ich bis jetzt weiß:
    - JPEG ist im RGB Format
    - ich brauche es im YCbCr Format

    Was ich nicht weiß:
    - Wie komme ich an die Pixel ran oder was sind die Pixel die ich von RGB zu YCbCr umwandeln soll?

    Um die Umwandlung durch zu führen brauch man ja so etwas:

    YCbCr HFilter::RGB_to_YCbCr(RGB pixel)
    {
        YCbCr newPixel;
        newPixel.Y = 0.299 * pixel.R + 0.587 * pixel.G + 0.114 * pixel.B;
        newPixel.Cb = - 0.168736 * pixel.R - 0.331264 * pixel.G + 0.5 * pixel.B + 128.0;
        newPixel.Cr = 0.5 * pixel.R - 0.418688 * pixel.G - 0.081312 * pixel.B + 128.0;
        return newPixel;
    }
    
    RGB HFilter::YCbCr_to_RGB(YCbCr pixel)
    {
        RGB newPixel;
        newPixel.R = (double)pixel.Y + 1.402 * ((double)pixel.Cr - 128.0);
        newPixel.G = (double)pixel.Y - 0.34414 * ((double)pixel.Cb - 128.0) - 0.71414 * ((double)pixel.Cr - 128.0);
        newPixel.B = (double)pixel.Y + 1.772 * ((double)pixel.Cb - 128.0);
        return newPixel;
    }
    

    Das Beispiel ist aus dem Internet kopiert also nicht von mir. Allgemein finde ich diese Umrechnung oft aber keine genau Erklärung dazu.

    Also ich wollte euch einfach bitten mir mal eine Seite zu geben wo ich mich informieren kann oder irgendwas wo ich Informationen bekomme.

    P.S.: Zum Projekt:
    CImg und Maick++ oder wie sie alle heißen möchte ich nicht benutzen es geht mir um das selbst schreiben. Ich beschäftige mich nun schon seit ungefähr 3 Monaten mit diesem Thema oder länger ich weiß es nicht genau. Ich bin noch C++ Anfänger und ja ich tue mich zwar schwer aber ich beiße mich da durch. Bitte keine doofen Kommentare, dann lieber keins. 🙂

    Vielen Dank soweit!!



  • Fuchs aus dem Wald schrieb:

    JPEG ist im RGB Format

    Nö, JPEG kann beides. Die meisten jpgs kommen aber in YCbCr daher, weil sie damit meistens platzsparender komprimiert werden können.

    Fuchs aus dem Wald schrieb:

    Wie komme ich an die Pixel ran oder was sind die Pixel die ich von RGB zu YCbCr umwandeln soll?

    Beim Speichern? Naja, du wirst dein Bild ja in irgendeiner (zweidimensionalen) Datenstruktur im RAM liegen haben. Wie du da auf einzelne Pixel zugreifst, weist du nur.
    Falls du das Laden meinst: Vor der Farbraumkonvertierung musst du ja erstmal das Dateiformat dekodieren, um dann das Bild dekomprimieren zu können. Wenn du soweit bist, und das Bild in einem Farbraum im Speicher liegen hast, kannst du mit den Umwandlungsformeln hier ( http://de.wikipedia.org/wiki/YCbCr ) einfach hin und her konvertieren. Auf der Seite ist auch ein Bischen dazu erklärt. Ist aber eigentlich eine simple Vektor-Matrix-Multiplikation.



  • Dobi schrieb:

    Beim Speichern? Naja, du wirst dein Bild ja in irgendeiner (zweidimensionalen) Datenstruktur im RAM liegen haben. Wie du da auf einzelne Pixel zugreifst, weist du nur.

    Danke für deine Antwort.

    Ist der letzte Satz nicht unvollständig?
    Mit Datenstuktur meinst du ein Array oder Vector richtig? Das hab ich. Trotzdem weis ich nicht wie ich an die 3 Zahlen von einem Pixel ran komme.



  • Trotzdem weis ich nicht wie ich an die 3 Zahlen von einem Pixel ran komme.

    Indem du dein JPEG-Bild dekomprimierst, und dann pro Pixel die Farbdarstellung wechselst.

    das JPEG. Dieses soll decodiert und encodiert werden ... Ich bin noch C++ Anfänger

    Hat man dir bereits gesagt: Das ist keine Aufgabe fuer Anfaenger.



  • knivil schrieb:

    Indem du dein JPEG-Bild dekomprimierst, und dann pro Pixel die Farbdarstellung wechselst.

    Wenn ich hier rein gucke dann sieht das danach aus, dass ich mit dem Farbraum anfangen müsste.

    knivil schrieb:

    Hat man dir bereits gesagt: Das ist keine Aufgabe fuer Anfaenger.

    Ja und ich mach es mir schwer. Weiß ich danke.



  • Fuchs aus dem Wald schrieb:

    Dobi schrieb:

    Beim Speichern? Naja, du wirst dein Bild ja in irgendeiner (zweidimensionalen) Datenstruktur im RAM liegen haben. Wie du da auf einzelne Pixel zugreifst, weist du nur.

    Danke für deine Antwort.

    Ist der letzte Satz nicht unvollständig?
    Mit Datenstuktur meinst du ein Array oder Vector richtig? Das hab ich. Trotzdem weis ich nicht wie ich an die 3 Zahlen von einem Pixel ran komme.

    Mit "Wie du da auf einzelne Pixel zugreifst, weist du nur." meinte ich "Nur du kannst wissen, wie du auf einzelne Pixel in deiner Bild-Datenstruktur zugreifst. Ich kenne sie ja nicht.". Auf mich wirkt der Satz nicht unvollständig, aber egal. 😉
    Ja, ich meinte damit ein Array oder Vector, oder was auch immer du da benutzt. Dann schau dir an, wie man mit sowas und Bilddaten darin umgeht. Wenn du das verstanden hast, kannst du es hier ja benutzen.



  • knivil schrieb:

    das JPEG. Dieses soll decodiert und encodiert werden ... Ich bin noch C++ Anfänger

    Hat man dir bereits gesagt: Das ist keine Aufgabe fuer Anfaenger.

    So ist es. Hast du dich denn schon mit der Struktur von Bilddateien beschäftigt, also wie Metainformationen und Pixeldaten gespeichert werden? Verstehst du zumindest den Ansatz dessen, was du kopiert hast?

    Fuchs aus dem Wald schrieb:

    Was ich nicht weiß:
    - Wie komme ich an die Pixel ran oder was sind die Pixel die ich von RGB zu YCbCr umwandeln soll?

    An die Pixeldaten ran kommst nach der Dekodierung der Bilddatei, was du mithilfe einer Bibliothek machen kannst (z.B. libjpeg). Umwandeln solltest du dann alle Pixel, denn einen Mix aus RGB und YCbCr Pixeln in einem Bild gibt es nicht (oder sollte es zumindest nicht geben).



  • Youka schrieb:

    knivil schrieb:

    das JPEG. Dieses soll decodiert und encodiert werden ... Ich bin noch C++ Anfänger

    Hat man dir bereits gesagt: Das ist keine Aufgabe fuer Anfaenger.

    So ist es. Hast du dich denn schon mit der Struktur von Bilddateien beschäftigt, also wie Metainformationen und Pixeldaten gespeichert werden? Verstehst du zumindest den Ansatz dessen, was du kopiert hast?

    Er kopiert ja nichtmal, er ist da ja schon seit einigen Monaten dran, wenn ich ihn da nicht verwechsle.



  • Fuchs aus dem Wald schrieb:

    knivil schrieb:

    Indem du dein JPEG-Bild dekomprimierst, und dann pro Pixel die Farbdarstellung wechselst.

    Wenn ich hier rein gucke dann sieht das danach aus, dass ich mit dem Farbraum anfangen müsste.

    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.



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


Log in to reply