logarithmic image transformation



  • Hallo Leute,

    wir (eine kleine Gruppe von Studenten) arbeiten zurzeit an einem Projekt namens Dr.Oste.
    Gerne würden wir unser Programm hier vorstellen, Verbesserungsvorschläge erfragen und um Hilfe bitten.

    Motivation:
    Zurzeit gibt es bereits Anwendungen, die es ermöglichen ein Bild mit Hilfe des Droste-
    Effekts zu bearbeiten, wie z.B. Plug-in für Photoshop oder Gimp.
    Da diese zusatzprogramme nicht mit jeder Version kompatibel sind oder viel Geld kosten,
    wird dieses standalone Programm entwickelt. Zudem sind vorhandene Programm meist unübersichtlich und für Laien
    nicht ganz einfach zu bedienen. Diese Software erlaubt dem Benutzer ein beliebiges Bild einzulesen,
    zu bearbeiten und anschließend abzuspeichern. Die Bearbeitung basiert auf den Droste-Effekt und bildet rekursives Abbild
    des Orginalbildes. Mathematischer Hintergrund: http://www.josleys.com/article_show.php?id=82

    Das Programm und der Code ist auf https://sourceforge.net/projects/drdroste/ gelistet.

    Und jetzt bitte ich euch um eure Meinung.
    Wie findet ihr das Projekt?
    Was würdet ihr ändern?
    Vielleicht fällt euch der Bug auf, dass die Berechnung des Vorschaubildes nicht ganz mit der Berechnung des Originalen übereinstimmt. Kennt ihr eine Lösung?

    Danke für eure Interesse.



  • Dieser Thread wurde von Moderator/in Jester aus dem Forum Mathematik und Physik in das Forum Projekte verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Keine Ahnung, ich kenn den Effekt nicht. Aber wenn es schon ein GIMP Plugin gibt, wäre ich auf jeden Fall dafür, das weiterzuentwickeln oder zu verbessern. Bildverarbeitung ist Bildverarbeitung, da ist ein Workflow wichtig und nicht tausend kleine Programme, die nichts miteinander zu tun haben.



  • Das Programm diente als Informatik-Projekt in der FH.
    Zudem ist es doch eine gute Übung zum Programmieren und für die Bildbearbeitung.
    Es muss ja nicht gleich immer ein Profi-Tool werden.

    Das Herzstück des Programms.
    ratio ist das Verhältnis zwischen Vorschaubild und Originalbild.

    QImage Edit::droste_effect(QImage img, QImage img_droste, double ratio, complex<double>shift, complex<double>rotate, double zoom, int Spirals, int filterValue, int max_rekursion, QRect selection)
    {
       //Mittelpunkt der Auswahl
       QPoint mitte = selection.center()*ratio;
       double ym=mitte.y();
       double xm=mitte.x();
    
       //Berechnung des Größenverhältnisses von Bild zu Auswahlbereich
       double xscale=(double)img.width()/((double)selection.width()*ratio);
       double yscale=(double)img.height()/((double)selection.height()*ratio);
       double m=(yscale*xscale)/2;
    
       //Berechnung des Droste Fixpunktes
       complex<double> Cl (img.width()/2,img.height()/2);
       complex<double> Cs(xm,ym);
       complex<double> Cf = Cl + ((Cl-Cs)/(1-m));
    
       //Neuer Punkt um den gedrostet werden soll
       xm=real(Cf);
       ym=imag(Cf);
    
       //Berechnung der Paramter für Droste Effect
       double alpha = atan((log(m)/(2*pi))*Spirals);
       double f = cos(alpha);
       complex<double> c_alpha (0,alpha);
       complex<double> beta = f*exp(c_alpha);
    
       //Abstand Droste-Fixpunkt zu Auswahlbereich, Fixpunkt. a = Offsetzoom
       double a=0.5*(double)min(selection.width(),selection.height());
       a=a*ratio;
       zoom=pow(zoom,Spirals);//damit wenn man sprialen erhöt, kein undefinierten Bereich sichtbar ist.
    
        //Transformation der einzellnen Pixel
        for(double x=0;x<img_droste.width();x++){
            for(double y=0;y<img_droste.height();y++){
    
             //Polarkoordinaten
             complex<double> z(x-xm,y-ym);   
             z = z + shift*ratio;         //Verschieben                           
             z = a*pow(z,beta/(beta*beta));   //Transformieren
             z = z*exp(-rotate);         //rotieren
             z = z/zoom;            //zommen
    
             //Rücktransformation
             for(int i=0;i<max_rekursion;i++)
             {
                z=z*m;
    
                double x_original = real(z)/((double)img_droste.width())+xm;
                double y_original = imag(z)/((double)img_droste.height())+ym;
    
                if((x_original<img.width() && x_original >= 0 && y_original >=0 && y_original <img.height())){               
                   QRgb Farbe = img.pixel(x_original,y_original);
                    img_droste.setPixel(x,y,Farbe);
                }
             }
          }
        }
       return img_droste;
    }
    

Anmelden zum Antworten