LookUpTable-Kinder-Fehler?!



  • Hallo zusammen,
    ich sitze jetzt die letzen Tage an einem Problem, dass langsam keinen Spaß mehr macht. Das folgende:

    Ich möchte ein Bild verändern, indem ich eine LUT erstelle, in der der "Ursprung" des Bildes gespeichert wird. Die LUT hat folgende Form:

    BPoint* lTable = new BPoint[xmax*ymax];
    

    Das BPoint ist ein Punkt, BPoint, da ich unter BeOS programmiere.

    Mein Code sieht also wie folgt aus:

    for(y=0;y<ymax;y++)
    {
      for(x=0;x<xmax;x++=
      {
        offset = y*xmay + x;
        //hier meine Berechnung die die alten Werte xn,yn liefert
        lTable[offset].x = xn;
        lTable[offset].y = yn;
      }
    }
    

    Bis hierhin ist alles super, funktioniert einwandfrei. Nun will ich aber danach nochmal eine Veränderung durchführen und die Ergebnisse in eine LUT speichern, wobei diese aber nicht auf die alte LUT (ab jetzt helpTable[]) sondern direkt auf die Original-Pixel verweisen soll.
    Das sieh bei mir wie folgt aus:

    for(y=0;y<ymax;y++)
    {
      for(x=0;x<xmax;x++)
      {
        offset = y*xmax + x;
        //Berechnung
        helpTable[offset].x = xn;
        helpTable[offset].y = yn;
      }
    }
    for(y=0;y<ymax;y++)
    {
      for(x=0;x<xmax;x++)
      {
        offset = y*xmax + x;
        //Berechnung
        offet2 = yn*xmax + xn;
        lTable[offset].x = helpTable[offset2].x;
        lTable[offset].y = helpTable[offset2].y;
      }
    }
    

    Soweit, sogut....funktionier aber nicht. Beide Algs (inkl. LUT) funktionieren nach Schema a) (das ganz obige). Sobald ich aber versuche, sie so hintereinander auszuführen kommen recht eigenartige Bilder raus.

    Warum?!?!

    Ich bin total am Verzweifeln, dieses ewige Rückwärts-Denken macht mich langsam total bekloppt. Irgendwo beim Verweis von lTable auf den entsprechenden Wert aus helpTable ist ein Denkfehler drin. Hab schon fleissig andere Denk-Ansätze versucht, aber die bringen auch nur Müll.

    Vielen Dank an alle, die die Geduld aufbringen, sich in diesen ... reinzuversetzen, ich kann das irgendwie nicht mehr objektiv betrachten, habs mit Skizzen, Rumprobieren usw. vesucht, aber irgendwie komm ich nicht auf meinen Fehler.

    Gruß M



  • ich sehe nirgendwo verweise.

    wenn die neue LUT nur verweise auf die originale enthalten soll (ist mir nicht ganz klar geworden was du genau machen willst) musst du nicht einen BPoint* nehmen, sondern BPoint** (also ein array von zeigern machen).



  • Ich verweise ja auf einen Punkt in der Grafik, also mit diesem BPoint. Das hat eine x- und y- Koordinate.
    Angenommen ich habe ein Ausgangsbild mit 100x100 Pixeln und will das auf 200x200 skalieren. Am Beispiel mit nur einer LUT z.B. könnte das so aussehen:

    for(y=0;y<200;y++)
    {
      for(x=0;x<200;x++)
      {
        offset = y*200+x;
        xn = (int) x/2;
        yn = (int) y/2;
        helpTable[offset].x = xn;
        helpTable[offset].y = yn;
      }
    }
    

    Nun kannn ich, wenn ich z.B. das Pixel(150;120) dastellen möchte in die LUt schauen, also helpTable[120*200+150].x/.y und bekomme die Info, welches Pixel aus dem Originalbild ich bei (150;120) darstellen muss, hier wäre das (75;60).

    Will ich jetzt danach das Bild nochmal mit 2 skalieren, mache ich folgendes:

    for(y=0;y<400;y++)
    {
      for(x=0;x<400;x++)
      {
        offset = y*400+x;
        xn = (int) x/2;
        yn = (int) y/2;
        offset2 = yn*200+xn;
        lTable[offset].x = helpTable[offset2].x;
        lTable[offset].y = helpTable[offset2].y;
      }
    }
    

    Nun sollte (nach meinen Überlegungen) in lTable.x/.y die zweimalskalierten Infos über das Pixel im Originalbild stehen. z.B. wenn ich Pixel(360;300) darstellen will, ist das ursprünglich mal (180;150) gewesen und die helpTable sagt mir, das dieser Pixel im Originalbild bei (90;75) zu finden ist.

    Eigentlich.....



  • Weiss nicht, ob ich mich freuen soll oder an die Wand gehen.

    Habe gerade mal der Einfachheit halber mein obiges Beispiel implementiert und es geht wunderbar.
    Das heisst also, dass

    a) meine Überlegung der 2 LUTs stimmt 👍
    b) meine zweiter Alg nicht funktioniert 👎

    Obwohl er, wie erwähnt, allein super läuft...naja, wird wohl am Rückwärtsrechnen liegen, also wieder alles ummodeln...


Anmelden zum Antworten