1Danke
ERLEDIGT
NEIN
NEIN
ANTWORTEN
5
5
ZUGRIFFE
832
832
EMPFEHLEN
-
30.08.11 11:02 #1
- 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ß
-
30.08.11 11:14 #2
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ß
FabioBitte 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.
-
30.08.11 15:49 #3
- 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!
-
30.08.11 15:57 #4
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ß
FabioBitte 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.
-
Geändert von Licorice (24.09.11 um 17:25 Uhr)
Freue mich über eine Bewertung oder ein Danke.
-
26.09.11 12:29 #6
- 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:
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 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;}
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ß





Zitieren
Login





