Doppelsumme



  • Hallo Leute!

    Würde euer Hilfe brauchen,da ich bei dieser Aufgaben ein wenig anstehe.
    Habe eine Doppelsumme zu lösen.

    Wobei u,v Koordinaten sind die auch durchlaufen werden:
    f(u,v)= Σi=0bis3Σj=0bis3(f(i,j)*h(u-i)*h(v-j))

    Wobei h(u-i) und h(v-j) auch noch Funktionen sind, aber dieses Problem habe ich schon gelöst.Hier kommen auch schon Werte zurück (Floats).

    Kann mir da wer von euch helfen.
    Bitte nicht zu komplexen Code schreiben, damit ich ihn auch verstehen kann. 😃

    Danke
    Luis



  • hihi

    die Funktionen f und h hast du ja schon gelöst dann musst du ja eigentlich nur multiplizieren und addieren.
    Ich würd's einfach mit 2 for-schleifen machen.^^

    #include <iostream>
    using namespace std;
    
    int main()
    {
        float end_erg = 0.0;
    
        for(int i=0; i<=3; i++)
        {
            float tmp_erg = 0.0;
    
            for(int j=0; j<=3; j++)
            {
                float fij = 1.0;
                float hui = 2.0;
                float hvj = 3.0;
    
                tmp_erg += ( fij*hui*hvj );
            }
    
            end_erg += tmp_erg;
        }
    
        cout << end_erg; // sollte 4*6*4 sein
        return 0;
    }
    

    mfg Dweb



  • @Dweb: die 2. "Laufvariable" die er hat ist "j" und nicht "u" 😉

    @s.luis: meinst du wirklich 2x f()?
    Also f(u,v) = ... f(i,j) ... - dasselbe f?
    In dem Fall wäre eine offensichtliche Lösung f(u,v) = 0 . Unabhängig von h , u oder v .

    Ansonsten, falls f(i,j) bekannte sein sollte ... hat Dweb ja schon geschrieben wie das geht.



  • hustbaer schrieb:

    In dem Fall wäre eine offensichtliche Lösung f(u,v) = 0. Unabhängig von h, u oder v.

    Hmm scho spät:D
    Wieso ist das offensichtlich "0"... sehs grad nicht auf anhieb.^^



  • Dweb schrieb:

    Wieso ist das offensichtlich "0"... sehs grad nicht auf anhieb.^^

    wenn f(i,j) = 0 für alle i,j => f(i,j)*h(u-i)*h(v-j) = 0 für alle u,v => f(u,v) = 0 und du hast ein konsistentes Ergebnis. (vermutlich nicht das einzige)



  • pumuckl schrieb:

    (vermutlich nicht das einzige)

    Ein weiterer Spezialfall wäre z.B. wenn h(i,j) = δij, dann steht da nämlich f(u,v) = f(u,v) und jede Funktion f ist eine Lösung...



  • Die Laufvariablen sind i und j in diesem Fall. u und v sind Koordinaten die auch übers gesamt Bild laufen. => 4 For-Schleifen ist schon ein wenig viel, aber es wird wohl nicht anders gehen. f(u,v) ist jene Funktion die einen Farbwert an der Stelle u,v berechnet. i und j sind wie eine Maske. Das ganze läuft unter den Namen bikubische Interpolation.

    Wenn f(u,v) = 0 ist dann ist der Farbwert schwarz, jedoch ist dann nicht immer richtig.

    Danke für eure Hilfe.
    Luis



  • Bzgl Interpolation auf Bildern kann ich das hier empfehlen. Ich benutze häufig B-Splines 3. Ordnung für h, weil sie sehr glatt sind und die Anwendung sehr schnell sein kann (je nach Implementierung).

    Es gibt da einige Tricks. ZB kann man sich eine Funktion schreiben, die h gleich auf einen Schlag an 4 Stellen abtastet. Dann ist die Formel noch nach x und y separierbar. Anders formuliert: Du kannst einiges ausklammern, so dass Du nichts doppelt und dreifach berechnen musst.

    /// computes weighting coefficients of some cubic "interpolator"
    /// @param x    0 <= x <= 1
    /// @param out  pointer for resulting weights
    void compute_h(double x, double out[])
    {
      out[0] = ...; // ein Polynom 3. Grades in x
      out[1] = ...; // ein Polynom 3. Grades in x
      out[2] = ...; // ein Polynom 3. Grades in x
      out[3] = ...; // ein Polynom 3. Grades in x
    }
    

    Benutzen könnte man das dann so:

    assert( 1 <= u && 1 <= v );
    int x0 = static_cast<int>(u); u -= x0;
    int y0 = static_cast<int>(v); v -= y0;
    assert( 0 <= u && u <= 1); // "rest"
    assert( 0 <= v && v <= 1); // "rest"
    --x0; --y0;
    double wx[4]; compute_h(u,wx);
    double wy[4]; compute_h(v,wy);
    double result = 0;
    for (int j=0; j<4; ++j)
      double tmp = 0;
      for (int i=0; i<4; ++i) {
        tmp += bild[y0+j][x0+i] * wx[i];
      }
      result += tmp * wy[j];
    }
    

    (ungetestet)



  • Okay danke.

    Nur das Problem ist das mit der Zeit ja die Maske über den Bildbereich hinausschaut oder? Bez. am Anfang nimmt sie mehr Punkte mit als sie soll.
    Da liegen meine Hauptfehler. Die Punkte die sie zuviel nimmt sollten einfach mit der Farbe schwarz (rgb) aufgefüllt werden.
    Nochwas zur 4x4 Maske. Wenn ich sie von 0-4 durchlaufe(in beide Richtugen),dann nehme nicht die richtigen Werte, da meine Koordinate die ich bekomme, nicht im Zentrum der Maske liegt, sonder am Rand oder?

    Danke für den Link, schaut gut aus muss ihn noch genauer durchlesen.

    Grüße
    Luis



  • s.luis schrieb:

    Nur das Problem ist das mit der Zeit ja die Maske über den Bildbereich hinausschaut oder? Bez. am Anfang nimmt sie mehr Punkte mit als sie soll.
    Da liegen meine Hauptfehler. Die Punkte die sie zuviel nimmt sollten einfach mit der Farbe schwarz (rgb) aufgefüllt werden.

    Ich verstehe nicht ganz was Du meinst. Wenn's um die Behandlung am Bildrand geht: Das bleibt dem Leser als Übung überlassen. 🙂

    s.luis schrieb:

    Nochwas zur 4x4 Maske. Wenn ich sie von 0-4 durchlaufe(in beide Richtugen),dann nehme nicht die richtigen Werte, da meine Koordinate die ich bekomme, nicht im Zentrum der Maske liegt, sonder am Rand oder?

    Nö, dafür gibt's ja das zur Null runden über static_cast<int> und das --x0 und --y0:

    u=6.6
                         |
                         V
    
    ...|....|....|....|....|....|....|...
       3    4    5    6    7    8    9
    
                 A    A    A    A
                 |    |    |    |
               x0+0 x0+1 x0+2 x+03
    

Anmelden zum Antworten