tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von Fabio Hellmann
ERLEDIGT
NEIN
ANTWORTEN
5
ZUGRIFFE
832
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Sunderfisch Sunderfisch ist offline Grünschnabel
    Registriert seit
    Aug 2011
    Beiträge
    3
    Guten Morgen,

    Bräuchte ein wenig Starthilfe für ein Programm, welches Affine Transformationen darstellt und berechnet. Wichtig: Die von Java mitgelieferte Klasse AffineTransform soll nicht verwendet werden, da der mathematische Hintergrund dieser Sache beleuchtet werden soll.

    Ich habe jetzt ein kleines Programm geschrieben, mit welchem ich per filechooser ein Bild einlesen kann und welches anschließend gezeichnet wird. Doch jetzt stehe ich auf dem Schlauch. Habe mich tagelang durch irgendwelche Java-Dokumentationen und Bücher gefressen, doch irgendwie sehe ich den Wald vor lauter Bäumen nicht mehr.

    Ich brauche jetzt eine Matrix, welche mir passend zu den x und y Koordinaten meines Bildes den entsprechenden Farbwert liefert. In der 1. Spalte an der 1. Stelle soll dann der Farbwert von dem Pixel mit den Koordinaten (1|1) stehen.

    Anschließend soll diese Matrix dann mit anderen Matrizen multipliziert werden um eine Translation, Rotation oder Skalierung zu demonstrieren.

    Gruß
     

  2. #2
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist offline Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Guten Morgen und Herzlich Willkommen bei Tutorials,

    bist du dir sicher, dass du die mathematischen Aspekte durchleuchten willst? Es gibt Dinge, die muss man nicht wissen, hauptsache sie funktionieren.

    Aber wenn du umbedingt wissen willst, wie das funktioniert, dann schau dir mal die Links hier an:
    Bildverarbeitung (Wiki)
    Image Rotation (Wolfram|Alpha)
    AfflineTransformation (Code)

    Gruß

    Fabio
     
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

  3. #3
    Sunderfisch Sunderfisch ist offline Grünschnabel
    Registriert seit
    Aug 2011
    Beiträge
    3
    Danke für die Links!

    Die mathematischen Aspekte habe ich alle mühsam hergeleitet, Rotationsmatrix, etc.

    Jetzt soll ein Programm zur Veranschaulichung dienen. Ein eingelesen Bild soll mit Hilfe der Rotationsmatrix gedreht werden, sprich, die Bildmatrix soll mit der Rotationsmatrix multipliziert werden.

    Leider fehlt mir aktuell der richtige ansatz, wie man diese Bildmatrix so einliest.
    Habe das ganze mit BufferedImage.getRaster probiert, oder auch mit dem Pixelgrabber, aber irgendwie ist das noch nicht das gesuchte Ergebnis.

    lg!
     

  4. #4
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist offline Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Ich habe das selber auch noch nicht gemacht, aber ich würde mir das mal so vorstellen.
    Das Bild besteht aus Pixeln (sprich: 255, 255, 255 [ein Farbpixel]). Wenn du diese Werte einließt, dann müsste der erste Farbpixel x=1 und y=1 sein. Dafür musst du das Bild als ByteArray einlesen. Das machst du am besten über die Klasse ImageIO.
    Und wenn du soweit bist, dann musst du diesen Farbpixel (meines erachtens nach) nur noch mithilfe deiner Rotationsmatrix drehen.

    Ich kann aber auch falsch liegen.

    Gruß

    Fabio
    Sunderfisch bedankt sich. 
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

  5. #5
    Avatar von Licorice
    Licorice Licorice ist offline Allrounder
    Registriert seit
    Sep 2011
    Ort
    (Thüringen)
    Beiträge
    8
    Zitat Zitat von Fabio Hellmann Beitrag anzeigen
    Und wenn du soweit bist, dann musst du diesen Farbpixel (meines erachtens nach) nur noch mithilfe deiner Rotationsmatrix drehen.

    Ich kann aber auch falsch liegen.
    Nö, das klingt gut. So kompliziert ist das eigentlich nicht. Wenn du deine Datenstruktur kennst, deine Rotationsmatrix hast und weißt wie man zwei Matrizen miteinander multipliziert, dürfte das kein Problem mehr sein.

    Hat es denn geklappt?
    Geändert von Licorice (24.09.11 um 17:25 Uhr)
     
    Freue mich über eine Bewertung oder ein Danke.

  6. #6
    Sunderfisch Sunderfisch ist offline Grünschnabel
    Registriert seit
    Aug 2011
    Beiträge
    3
    Ich habe es weiter versucht, stehe nun aber vor einem neuartigen Problem:

    Mein Ziel ist es eine Drehung der Bilder Mittels der Rotationsmatrix zu veranschaulichen.
    Zuerst verändere ich die x- und y-Werte durch Multiplikation mit der Zeiler der Matrix:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    double a = Math.cos(winkel*Math.PI / 180);
              double b = -Math.sin(winkel*Math.PI / 180);
              double c = Math.sin(winkel*Math.PI / 180);
              double d = Math.cos(winkel*Math.PI / 180);
     
    for (int i=0;i<Bild.getWidth();i++){
                  xwerteneuneu[i] =   xwerteneu[i] * a + ywerteneu[i] *b;}
               
     for (int i=0;i<Bild.getHeight();i++){
                  ywerteneu[i] = xwerteneu[i] *c + ywerteneu[i]*d;}
    Anschließend soll nun in ein neu angelegtes BufferedImage die Farbe von den Koordinaten des alten Bildes an die neuen Koordinaten gesetzt werden:
    Code :
    1
    2
    3
    
    for (int i = 0;i<Bild.getWidth();i++){
        for(int k=0;k<Bild.getHeight();k++){
    img.setRGB((int)xwerteneuneu[i],(int)ywerteneu[k], farbe);

    Folgendes Problem ergibt sich hierbei:
    Ein Pixel wird mehrfach beschrieben, da es durch Rundungen öfter zum gleichen Wert führt, sprich die Drehung sieht hinterher nicht so aus, wie sie sein soll.
    Hat jemand eine Ahnung, wie man dieses Problem umgehen kann?
    Via geeigneter Interpolation oder so?

    Gruß