Kennt sich hier jemand mit Bitmaptransformation aus?

Allgemeine Fragen zu Lasershow Software und Show-Programmierung.
Antworten
Benutzeravatar
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?

Beitrag von jojo » Mi 28 Jan, 2015 12:51 pm

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. :wink:

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
Scan-150112-0005_web.jpg
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 !

Benutzeravatar
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?

Beitrag von Hatschi » Mi 28 Jan, 2015 6:28 pm

Halli Hallo

Warum kein upscaling schon im Vorhinein mit einer Bild-Soft?

Hatschi

john
Beiträge: 1823
Registriert: Mi 13 Jun, 2001 12:00 pm
Wohnort: Berlin

Re: Kennt sich hier jemand mit Bitmaptransformation aus?

Beitrag von john » Mi 28 Jan, 2015 7:48 pm

Hmm, schonmal in die OpenCV library geschaut? Vielleicht ist dort etwas dabei...
Anbieterkennzeichnung - http://www.cyberstoff.de/Impressum

Benutzeravatar
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?

Beitrag von dyak » Mi 28 Jan, 2015 10:08 pm

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!

Benutzeravatar
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?

Beitrag von jojo » Do 29 Jan, 2015 10:11 am

Hatschi hat geschrieben: Warum kein upscaling schon im Vorhinein mit einer Bild-Soft?
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.
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. :wink:
john hat geschrieben:Hmm, schonmal in die OpenCV library geschaut? Vielleicht ist dort etwas dabei...
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.
Trotzdem Danke.
dyak hat geschrieben:Wo ist das Problem bei der bilinearen Interpolation?
Hachja.. :roll:

Gruß

Joachim
Producer of NetLase, EasyLase USB and Raytrack scanners
http://www.jmlaser.com
Gewerbliches Mitglied

NO private messages please !

Benutzeravatar
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?

Beitrag von Hatschi » Do 29 Jan, 2015 3:11 pm

Vielleicht bei Panoramasoftware mal umsehen?

Benutzeravatar
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?

Beitrag von dyak » Do 29 Jan, 2015 6:36 pm

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

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'
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 :wink:
Wer Rechtschreibfehler findet, darf sie behalten!

Benutzeravatar
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?

Beitrag von dyak » Do 29 Jan, 2015 8:42 pm

Oh grad gemerkt das ist doch eine lineare Transformation :roll:
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!

Benutzeravatar
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?

Beitrag von jojo » Fr 30 Jan, 2015 3:22 pm

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:
ttt2 Kopie.jpg
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.
Transform_60Grad Kopie.jpg
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 !

Benutzeravatar
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?

Beitrag von dyak » Fr 30 Jan, 2015 10:20 pm

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.
Wer Rechtschreibfehler findet, darf sie behalten!

Antworten

Zurück zu „Software & Programmierung“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste