LaserFreak Forum
Kennt sich hier jemand mit Bitmaptransformation aus?
- jojo
- Beiträge: 1938
- Registriert: Fr 21 Dez, 2001 12:00 pm
- Do you already have Laser-Equipment?: -
- Wohnort: Germany
- Kontaktdaten:
Kennt sich hier jemand mit Bitmaptransformation aus?
Hat jetzt nichts direkt mit Lasershow zu tun, sondern mit einem privaten Projekt in der Fototechnik.
Daher geht die Frage eher an Programmierer und Mathematiker.
Ich suche einen Algorithmus zur Transformation von Bitmaps für die Entzerrung einer Galvoprojektion.
Konkret:
Die Projektion auf eine ebene Fläche erzeugt ja bekanntlich Verzerrungen, siehe Bild.
Dabei wird ja in Abhängigkeit des Auslenkwinkels Alpha die Y-Position mit Y' = Y * 1/cos Alpha(Y) und in X mit X' = X * (1/cos Alpha(X) * 1/cos Alpha(Y) gestreckt.
Um eine Bitmap unverzerrt auf eine ebene Fläche zu projizieren, benötige ich vorab eine Transformation der Quellbitmap, damit diese nach dem Scannen (zeilenweise) wieder unverzerrt auf der Ebene erscheint.
Mein Problem ist dabei nicht einen einzelnen Punkt X/Y mit Cosinus auf eine neue Position umzurechnen, sondern alle Pixel einer Bitmap zu interpolieren. Bei einer einfachen Vektorgrafik ist das easy. Bei einer Bitmap aber kann man ja nicht einfach die Pixel überschreiben, sondern muss die Farben bilinear interpolieren. Und da fängt mein Problem an.
Gegeben sind der eingestellte maximale Auslenkwinkel der Scanner und die maximale Pixelzahl bei diesem Winkel (z.B. 4096). Je nach Größe der Quellbitmap (z.B. 3500 x 2000 Pixel) muss diese passend auf den Scanner transformiert werden. Der Maximalwinkel der Scanner bleibt fest. Die Ausgabebildgröße wird nur durch die Größe der Quellbitmap definiert. Eine kleinere Bitmap erfährt daher natürlich eine geringere Verzerrung als eine Bitmap maximaler Größe. Also wenn ich die Scanner auf 40 Grad Vollwinkel eingestellt habe, würde der Rand einer 4096 Pixel Bitmap mit 20 Grad Halbwinkel projiziert und eine 1024er Bitmap mit 5 Grad.
Die Zielbitmap sollte idealerweise bilinear interpoliert sein, eventuell später optional "nearest Neighbour".
Es handelt sich um RGB-Bitmaps 24Bit.
Ich habe jetzt schon stundenlang gegoogelt, aber was es da an Code (ich nehme Delphi) gibt, ist mehr als dürftig.
Die Rechengeschwindigkeit ist nicht allzu dramatsch. Das Bild wird sowieso vorberechnet und dann per Knopfdruck ausgegeben. Also kein "Echtzeitproblem).
Nun die Frage: Kennt sich von Euch jemand mit Grafikprogrammierung aus? Könnte jemand so eine Transformation schreiben, ohne dazu exotische Libraries, GDI oder Open-GL zu verwenden, also "zu Fuß"?
Es muss nicht direkt in Delphi sein. Ich könnte auch mit "Pseudocode" im Klartext leben, nur keine Programmiersprachen, die ich nicht übersetzen kann.
Als Funktionsaufruf stelle ich mir folgende Art vor (Delphi):
function transform(MaxScanangle : integer; SourceBitmap : TBitmap) : TBitmap;
Wenn damit jemand Erfahrung hat, wäre es toll, wenn er sich meldet.
Aber bitte nur falls jemand wirklich damit Erfahrung hat und mehr oder weniger in die Schublade greifen kann. Denn von Null anzufangen macht keinen Sinn. Dann kann ich es auch gleich selbst machen.
Das Problem ist einfach dass ich gerade wenig Zeit habe.
Es handelt sich um ein privates Projekt und um nichts kommerzielles.
Gruß
Joachim
Daher geht die Frage eher an Programmierer und Mathematiker.
Ich suche einen Algorithmus zur Transformation von Bitmaps für die Entzerrung einer Galvoprojektion.
Konkret:
Die Projektion auf eine ebene Fläche erzeugt ja bekanntlich Verzerrungen, siehe Bild.
Dabei wird ja in Abhängigkeit des Auslenkwinkels Alpha die Y-Position mit Y' = Y * 1/cos Alpha(Y) und in X mit X' = X * (1/cos Alpha(X) * 1/cos Alpha(Y) gestreckt.
Um eine Bitmap unverzerrt auf eine ebene Fläche zu projizieren, benötige ich vorab eine Transformation der Quellbitmap, damit diese nach dem Scannen (zeilenweise) wieder unverzerrt auf der Ebene erscheint.
Mein Problem ist dabei nicht einen einzelnen Punkt X/Y mit Cosinus auf eine neue Position umzurechnen, sondern alle Pixel einer Bitmap zu interpolieren. Bei einer einfachen Vektorgrafik ist das easy. Bei einer Bitmap aber kann man ja nicht einfach die Pixel überschreiben, sondern muss die Farben bilinear interpolieren. Und da fängt mein Problem an.
Gegeben sind der eingestellte maximale Auslenkwinkel der Scanner und die maximale Pixelzahl bei diesem Winkel (z.B. 4096). Je nach Größe der Quellbitmap (z.B. 3500 x 2000 Pixel) muss diese passend auf den Scanner transformiert werden. Der Maximalwinkel der Scanner bleibt fest. Die Ausgabebildgröße wird nur durch die Größe der Quellbitmap definiert. Eine kleinere Bitmap erfährt daher natürlich eine geringere Verzerrung als eine Bitmap maximaler Größe. Also wenn ich die Scanner auf 40 Grad Vollwinkel eingestellt habe, würde der Rand einer 4096 Pixel Bitmap mit 20 Grad Halbwinkel projiziert und eine 1024er Bitmap mit 5 Grad.
Die Zielbitmap sollte idealerweise bilinear interpoliert sein, eventuell später optional "nearest Neighbour".
Es handelt sich um RGB-Bitmaps 24Bit.
Ich habe jetzt schon stundenlang gegoogelt, aber was es da an Code (ich nehme Delphi) gibt, ist mehr als dürftig.
Die Rechengeschwindigkeit ist nicht allzu dramatsch. Das Bild wird sowieso vorberechnet und dann per Knopfdruck ausgegeben. Also kein "Echtzeitproblem).
Nun die Frage: Kennt sich von Euch jemand mit Grafikprogrammierung aus? Könnte jemand so eine Transformation schreiben, ohne dazu exotische Libraries, GDI oder Open-GL zu verwenden, also "zu Fuß"?
Es muss nicht direkt in Delphi sein. Ich könnte auch mit "Pseudocode" im Klartext leben, nur keine Programmiersprachen, die ich nicht übersetzen kann.
Als Funktionsaufruf stelle ich mir folgende Art vor (Delphi):
function transform(MaxScanangle : integer; SourceBitmap : TBitmap) : TBitmap;
Wenn damit jemand Erfahrung hat, wäre es toll, wenn er sich meldet.
Aber bitte nur falls jemand wirklich damit Erfahrung hat und mehr oder weniger in die Schublade greifen kann. Denn von Null anzufangen macht keinen Sinn. Dann kann ich es auch gleich selbst machen.
Das Problem ist einfach dass ich gerade wenig Zeit habe.
Es handelt sich um ein privates Projekt und um nichts kommerzielles.
Gruß
Joachim
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Producer of NetLase, EasyLase USB and Raytrack scanners
http://www.jmlaser.com
Gewerbliches Mitglied
NO private messages please !
http://www.jmlaser.com
Gewerbliches Mitglied
NO private messages please !
- Hatschi
- Beiträge: 3531
- Registriert: Mi 13 Mär, 2002 12:00 pm
- Wohnort: Kaernten/Austria
- Kontaktdaten:
Re: Kennt sich hier jemand mit Bitmaptransformation aus?
Halli Hallo
Warum kein upscaling schon im Vorhinein mit einer Bild-Soft?
Hatschi
Warum kein upscaling schon im Vorhinein mit einer Bild-Soft?
Hatschi
Re: Kennt sich hier jemand mit Bitmaptransformation aus?
Hmm, schonmal in die OpenCV library geschaut? Vielleicht ist dort etwas dabei...
Anbieterkennzeichnung - http://www.cyberstoff.de/Impressum
- dyak
- Beiträge: 424
- Registriert: Do 14 Feb, 2008 2:18 pm
- Do you already have Laser-Equipment?: 2 x Sats(150mW Grün, 400mW Rot 658nm, 200mw Blau 445nm) + Hauptprojektor(400mW Grün, 350mW Rot 637nm, 500mW Blau 445nm) + Eigenbau DAC + Eigenbau Treiber
- Wohnort: Garching b. München
Re: Kennt sich hier jemand mit Bitmaptransformation aus?
Wo ist das Problem bei der bilinearen Interpolation? Wichtig ist dass man eben nicht für jeden Pixel aus dem Quellbild einen Pixel in das Zielbild schreiben will sondern dass jeder Pixel in dem Zielbild aus einer Menge aus Pixeln aus dem Quellbild errechnet wird.
Wer Rechtschreibfehler findet, darf sie behalten!
- jojo
- Beiträge: 1938
- Registriert: Fr 21 Dez, 2001 12:00 pm
- Do you already have Laser-Equipment?: -
- Wohnort: Germany
- Kontaktdaten:
Re: Kennt sich hier jemand mit Bitmaptransformation aus?
Danke für den Hinweis. Weil ich es mathematisch korrekt haben will und ich bereits eine Software schreibe und nicht jedes Bild in jeder Größe vorbearbeiten will.Hatschi hat geschrieben: Warum kein upscaling schon im Vorhinein mit einer Bild-Soft?
Aber wenn Du eine Funktion in PS, GIMP oder sonstwas kennst, die die Transformation per Eingabe korrekt berechnen kann, dann sag an.
Ich hab nur Spielzeugfilter wie "Warp", "Squirl", Projektion auf Objekte (die man NICHT frei definieren kann) und irgendwelches Verwabbeln und Verwurschteln per Mauszeiger oder Fantasieparameter gefunden. Alles ein Haufen Mist.
Danke John. Ja, ich habe reingeschaut. Auch in GIMP, welches ja auch Open Source ist. Da ist garantiert die gesuchte Funktion drin. Leider muss ich zugeben, dass ich mit der Analyse solcher Monsterprojekte maßlos überfordert bin. Ich bin halt kein professioneller Programmierer. Alleine das Einarbeiten, die ganzen Dokus und der Versuch der Übersetzung in Delphi würden mich ein Vielfaches an Zeit kosten, welche ich wohl für die reine Funktion alleine benötigen würde. Ich suche wirklich NUR diese eine Funktion. Danach ist mein Programm fertig. Mehr Grafikzeugs kommt nicht hinein.john hat geschrieben:Hmm, schonmal in die OpenCV library geschaut? Vielleicht ist dort etwas dabei...
Trotzdem Danke.
Hachja..dyak hat geschrieben:Wo ist das Problem bei der bilinearen Interpolation?
Gruß
Joachim
Producer of NetLase, EasyLase USB and Raytrack scanners
http://www.jmlaser.com
Gewerbliches Mitglied
NO private messages please !
http://www.jmlaser.com
Gewerbliches Mitglied
NO private messages please !
- Hatschi
- Beiträge: 3531
- Registriert: Mi 13 Mär, 2002 12:00 pm
- Wohnort: Kaernten/Austria
- Kontaktdaten:
Re: Kennt sich hier jemand mit Bitmaptransformation aus?
Vielleicht bei Panoramasoftware mal umsehen?
- dyak
- Beiträge: 424
- Registriert: Do 14 Feb, 2008 2:18 pm
- Do you already have Laser-Equipment?: 2 x Sats(150mW Grün, 400mW Rot 658nm, 200mw Blau 445nm) + Hauptprojektor(400mW Grün, 350mW Rot 637nm, 500mW Blau 445nm) + Eigenbau DAC + Eigenbau Treiber
- Wohnort: Garching b. München
Re: Kennt sich hier jemand mit Bitmaptransformation aus?
Also du nimmst die Koordinaten von einem Pixel in deinem Zielbild. Dann machst du das Inverse von deiner nichtlinearen Transformation und bekommst die Koordinaten im Quellbild.
Für die Nearest Point Interpolation suchst du jetzt einfach den Pixel der deiner ausgerechneten Koordinate am nähsten ist und trägst den Pixel an der Stelle ein von der du ausgegangen bist (Zielbild).
Für die bilineare Interpolation suchst du die vier Pixel die diese Koordinate umgeben. Aus diesen vier Pixel rechnest du dann den Wert für das Zielpixel aus.
So jetzt kommt der tricky Part.
Angenommen x' und y' sind die rationalen Koordinaten des Pixel der dich im Quellbild interessiert.
Dann ist
Wobei f(0,0) z.B. der Pixel unten Links ist und f(1,1) der Pixel oben Rechts usw.
Ich hoffe das ist verständlich und stimmt soweit
Für die Nearest Point Interpolation suchst du jetzt einfach den Pixel der deiner ausgerechneten Koordinate am nähsten ist und trägst den Pixel an der Stelle ein von der du ausgegangen bist (Zielbild).
Für die bilineare Interpolation suchst du die vier Pixel die diese Koordinate umgeben. Aus diesen vier Pixel rechnest du dann den Wert für das Zielpixel aus.
So jetzt kommt der tricky Part.
Angenommen x' und y' sind die rationalen Koordinaten des Pixel der dich im Quellbild interessiert.
Dann ist
Code: Alles auswählen
f(x', y') = f(0,0) + (f(1,0) - f(0,0))*x' + (f(0,1) - f(0,0))*y' + (f(0,0) - f(1,0) - f(0,1) + f(1,1))*x'*y'
Ich hoffe das ist verständlich und stimmt soweit
Wer Rechtschreibfehler findet, darf sie behalten!
- dyak
- Beiträge: 424
- Registriert: Do 14 Feb, 2008 2:18 pm
- Do you already have Laser-Equipment?: 2 x Sats(150mW Grün, 400mW Rot 658nm, 200mw Blau 445nm) + Hauptprojektor(400mW Grün, 350mW Rot 637nm, 500mW Blau 445nm) + Eigenbau DAC + Eigenbau Treiber
- Wohnort: Garching b. München
Re: Kennt sich hier jemand mit Bitmaptransformation aus?
Oh grad gemerkt das ist doch eine lineare Transformation
Ich habe noch eine gute Anleitung gefunden. Seite 5 Slide 9
http://cvpr.uni-muenster.de/teaching/ws ... BV04-2.pdf
Ich habe noch eine gute Anleitung gefunden. Seite 5 Slide 9
http://cvpr.uni-muenster.de/teaching/ws ... BV04-2.pdf
Wer Rechtschreibfehler findet, darf sie behalten!
- jojo
- Beiträge: 1938
- Registriert: Fr 21 Dez, 2001 12:00 pm
- Do you already have Laser-Equipment?: -
- Wohnort: Germany
- Kontaktdaten:
Re: Kennt sich hier jemand mit Bitmaptransformation aus?
Hi,
@Dyak: Sehr aufschlussreiches PDF.Danke!
Ich habe das jetzt mal hinbekommen, aber ein Vergnügen wars nicht.
Das Prinzip war relativ einfach, aber mit der Umsetzung hat es gehapert. Das Problem war, dass ich ja eine symmetrische Verzerrung haben will, aber die Bitmaps ihren Ursprung 0,0 ja in der Ecke haben. Das war ein ziemliches Gekrampfe, bis ich die Pointer soweit hatte.
Das Ergebnis sieht jetzt so aus:
Da ich noch ein Problem mit der Größe der Zielbitmap habe, kommt es zu dem Gekrösel am Rand. Aber der Bildinhalt ist komplett drauf.
Die Zielbitmap wird ja kleiner, aber immer wenn ich die auf die berechnete Größe einstelle, passt das Bild nicht rein. Komisch..
Daher habe ich jetzt das Ziel noch größer gehalten mit dem Ergebnis dass es einen unsauberen Rand gibt.
Aber das Prinzip klappt schonmal.
Das Ausgangsbild für mein Anfangs gezeigtes Bild müsste bei einem Scanwinkel von 60 Grad so aussehen, damit das Ergebnis unverzerrt wird.
Ich bin gespannt.
Wenn das klappt wird die Sache in meine Software integriert und das ganze läuft dann automatisiert.
Gruß
Joachim
@Dyak: Sehr aufschlussreiches PDF.Danke!
Ich habe das jetzt mal hinbekommen, aber ein Vergnügen wars nicht.
Das Prinzip war relativ einfach, aber mit der Umsetzung hat es gehapert. Das Problem war, dass ich ja eine symmetrische Verzerrung haben will, aber die Bitmaps ihren Ursprung 0,0 ja in der Ecke haben. Das war ein ziemliches Gekrampfe, bis ich die Pointer soweit hatte.
Das Ergebnis sieht jetzt so aus:
Da ich noch ein Problem mit der Größe der Zielbitmap habe, kommt es zu dem Gekrösel am Rand. Aber der Bildinhalt ist komplett drauf.
Die Zielbitmap wird ja kleiner, aber immer wenn ich die auf die berechnete Größe einstelle, passt das Bild nicht rein. Komisch..
Daher habe ich jetzt das Ziel noch größer gehalten mit dem Ergebnis dass es einen unsauberen Rand gibt.
Aber das Prinzip klappt schonmal.
Das Ausgangsbild für mein Anfangs gezeigtes Bild müsste bei einem Scanwinkel von 60 Grad so aussehen, damit das Ergebnis unverzerrt wird.
Ich bin gespannt.
Wenn das klappt wird die Sache in meine Software integriert und das ganze läuft dann automatisiert.
Gruß
Joachim
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Producer of NetLase, EasyLase USB and Raytrack scanners
http://www.jmlaser.com
Gewerbliches Mitglied
NO private messages please !
http://www.jmlaser.com
Gewerbliches Mitglied
NO private messages please !
- dyak
- Beiträge: 424
- Registriert: Do 14 Feb, 2008 2:18 pm
- Do you already have Laser-Equipment?: 2 x Sats(150mW Grün, 400mW Rot 658nm, 200mw Blau 445nm) + Hauptprojektor(400mW Grün, 350mW Rot 637nm, 500mW Blau 445nm) + Eigenbau DAC + Eigenbau Treiber
- Wohnort: Garching b. München
Re: Kennt sich hier jemand mit Bitmaptransformation aus?
Es gibt ja bei diesen Transformationen und Interpolationen immer ein Rand Problem. Du solltest am besten überprüfen ob der Pixel auf den du zugreifen willst im Quellbild überhaupt noch im Bild liegt. Wenn nicht solltest du einfach einen schwarzen Wert einfügen.
Vielleicht kommt diese gekrösel daher.
Vielleicht kommt diese gekrösel daher.
Wer Rechtschreibfehler findet, darf sie behalten!
Wer ist online?
Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste