Bitmap Pixel Koordinaten ändern

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
wp_xyz
Beiträge: 3306
Registriert: Fr 8. Apr 2011, 09:01

Re: Bitmap Pixel Koordinaten ändern

Beitrag von wp_xyz »

Wegen der Geschwindigkeit habe ich mein Demo-Programm von oben für LazIntfImage umgeschrieben, und das ist jetzt erheblich schneller. Ich habe auch einmal das Original-Bild aus dem Beitrag weiter oben verwendet, und auch da erscheint das berechnete Bild augenblicklich.

Zum Testen einfach auf den "Entzerren"-Button klicken; die Referenzpunkte sind bereits eingetragen. Die Entzerrung funktioniert korrekt, es gibt keine "Löcher" (wie sollte es auch, denn die x/y-Schleife läuft ja über die Pixel des Zielbildes).
Dateianhänge
Entzerrung_LazIntfImage.zip
(677.2 KiB) 42-mal heruntergeladen

ErnstVolker
Beiträge: 241
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Bitmap Pixel Koordinaten ändern

Beitrag von ErnstVolker »

Hallo wp_xyz, hallo Winni,

zunächst einmal vielen Dank für die Hilfe.

Ich habe das Beispiel mal etwas abgeändert um meinen Hintergrund der Überlegungen, warum ich überhaupt das Programm bastel darzulegen. Im Anhang dazu eine Textadtei die in Das Stringgrid geladen werden kann. Das sind die Eckpunkte des roten Qadrates in Bildmitte.

Wenn man hier im Quelltext:

Code: Alles auswählen

const
  PD: T4Points = (          // Ziel-Bild ("D" = destination)
    (x:  0;   y:    0),
    (x:  0;   y:30),
    (x:30; y:30),
    (x:30; y:    0)
  );


die Kantenlängen des Quadrates (das meinte ich immer mit "wahren Längen" bzw. "Weltkoordinate") vorgibt und den weiteren Quelltext etwas ändert:

Code: Alles auswählen

        destImg.SetSize(round(7*PD[2].X), round(6*PD[2].Y)); //----------------------->>>> Die "7" und die "6" sind frei gewählt, damit es passt. Setzt man die "6" auf "7", dann wird denom zu Null (zumindest bei mir)
        for y := 0 to destImg.Height - 1 do
        begin
          for x := 0 to destImg.Width - 1 do
          begin
            denom := (c[6] * x + c[7] * y + 1);
            u := (c[0] * x + c[1] * y + c[2]) / denom - destImg.Width / 3// ---------->>>> Auch hier ist das "1/3" bzw. in der nächsten Zeile "1/2" einfach durch Ausprobieren gesetzt.
            v := (c[3] * x + c[4] * y + c[5]) / denom - destImg.Height / 2;
 

dann erhält man das komplett entzerrte Bild.

Lässt man "7 * " und "6 * " sowie "- destImg.Width / 3" und " - destImg.Height / 2" weg, dann wird in Image2 nur das kleine Quadrat angezeigt.

Das angehängte Bild zeigt auch, dass das entzerrte Bild kleiner als das Ausgangsbild ist. Ich hätte es gerne genauso groß bei identischer Bildqualität.

Ich muß noch nachtragen, dass das Bild hier nur ein Testbild ist. Man kann sich aber vorstellen, dass es sich bei so einer Aufnahme um ein Stück Straße handelt, wo neben einem Wassereinlauf (das rote Quadrat dessen Abmessungen man kennt) eine Reifenspur verläuft (der Bogen rechts unterhelb daneben). Länge und Lage des Bogens sind dann das Interessante.
Klar kann man vier "Hütchen" oder ähnliches auf die Straße stellen und die vier Passpunkte gegeneinander vermessen (im Bild die vier Ecken mit den Diagonalen) aber das ist häufig nicht der Fall. Manchnal steht eben einfach nur ein Bild zur Verfügung und man muß sich, was die "wahren Längen" angeht, mit dem begnügen was da ist. Mittenmarkierung, Blockmarkierung, Kanaldeckel etc. Man ist nicht unbedingt zugegen wenn eine Spur noch frisch ist. Man wird häufig ein halbes oder 3/4 Jahr oder noch später damit konfrontiert. Dann ist die Spur längst weg, der Deckel oder die Markierungen aber noch da.

Meiner Meinung ist das auch sehr fehlerbehaftet. Ich denke man sollte hier beim Testbild nicht auf die Idee kommen das unterste linke 5 x 5 mm Kästchen als Referenz heran zu ziehen um dann die Abmessungen des roten Quadrates, des umgebenden Vielecks, der Ellipse oder des Bogens ermitteln zu wollen.

Viele Grüße

Volker
Dateianhänge
Ergebnis.PNG
EckenQuadrat.txt
(943 Bytes) 46-mal heruntergeladen
Zuletzt geändert von ErnstVolker am Do 13. Feb 2020, 22:34, insgesamt 1-mal geändert.

Winni
Beiträge: 336
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.06, fpc 3.04
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Bitmap Pixel Koordinaten ändern

Beitrag von Winni »

Hallo!

Ich hab mal auf die Schnelle dem Project 3 Optionen hinzugefügt:

a) Mittels BGRA eine lineare Projection
b) Mittels BGRA eine perspectivische Projection
c) Danach kann man das Bild schärfen.

Ich wollte nur zeigen wie einfach es damit geht.

Winni
Dateianhänge
Entzerren.zip
(695.04 KiB) 53-mal heruntergeladen

ErnstVolker
Beiträge: 241
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Bitmap Pixel Koordinaten ändern

Beitrag von ErnstVolker »

Wie kann man denn ein LazIntfImage vergrößern? Bei den BGRABitmap geht es mit Resample.

Winni
Beiträge: 336
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.06, fpc 3.04
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Bitmap Pixel Koordinaten ändern

Beitrag von Winni »

Mit

TLazCanvas.StretchDraw

Winni

wp_xyz
Beiträge: 3306
Registriert: Fr 8. Apr 2011, 09:01

Re: Bitmap Pixel Koordinaten ändern

Beitrag von wp_xyz »

ErnstVolker hat geschrieben:Wie kann man denn ein LazIntfImage vergrößern?

Das steht im wiki: https://wiki.freepascal.org/Developing_ ... _LazCanvas

Ich finde, es ist falsch, wenn du die Koeffizienten der Transformationsgleichung berechnest und hinterher mit beliebigen Faktoren multiplizierst - dann sind das doch keine Lösungen mehr. Um mehr als das Zielviereck PD zu transformieren, musst du das Zielbitmap größer machen (das machst du), aber damit das rote Viereck nicht in die linke obere Ecke landet, musst du einen Offset auf die berechneten Koordinaten u, v addieren - das verschiebt quasi das transformierte Viereck im Zielbitmap. Auf diese Weise ist das rote Viereck immer gleich groß und im Zielbitmap sieht man, je nach Größe des Zielbitmaps mehr von der Umgebung. Allerdings muss bei jedem Zugriff auf Pixel nun geprüft werden, ob nicht der Bildbereich verlassen wird.

In der beigefügten Abwandlung des obigen Demo-Programms sind die Koordinaten des roten Vierecks (vom Blatt abgelesen) schon im Grid eingetragen. Es kann nun ein größerer Ausschnitt als diese Viereck entzerrt werden. Mit den beiden Schiebereglern W und H kann das Zielbitmap breiter bzw. höher gemacht werden als das Referenzviereck PD fordert. Und mit den Schiebereglern dx und dy können die Koordinaten eines Zielpunktes in der Rechnung um einen entsprechenden Wert verschoben werden, wodurch man das Referenzviereck im Zielbitmap hinundherschiebt.

Aber: Man sieht auch dass das Referenz-Viereck zwar einigermaßen quadratisch ist, das Blatt Papier jedoch noch deutlich verzerrt ist. Ich denke, das kommt von der Perspektive: die rechten Winkel des Blattes werden unterschiedlich stark verzerrt, je nach dem, wie weit der entsprechende Eckpunkt vom Betrachter entfernt ist. Wahrscheintlich hängt das Ergebnis sehr empfindlich von der Wahl der koordinaten des roten Quadrats im Ausgangsbild ab. Nimmt man dagegen, wie bisher, die Koordinaten des alles einschließenden DIN A4 Blatts, tritt der Effekt nicht auf. Es könnte aber auch sein, dass die bisher verwendete Mathematik den Spezialfall der Extrapolation nicht richtig behandelt. (In winni's Demo gibt es einen Button "BGRA perspektivisch" - vielleicht kommt man hier weiter?)
Dateianhänge
Entzerrung.png
Entzerrung_LazIntfImage.zip
(680.61 KiB) 50-mal heruntergeladen

ErnstVolker
Beiträge: 241
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Bitmap Pixel Koordinaten ändern

Beitrag von ErnstVolker »

Hallo,

ich war das Wochenende nicht in der Nähe eines Rechners, deshalb erst jetzt meine Rückmeldung.

Vielen Dank für die Hilfe. Das mit den Schiebereglern ist optimal und bombig. Vor allem auch das Umgehen der Nulldivision und Darstellung der "Überbreite" mit schwarzem Rand Da wär' ich so schnell nicht drauf gekommen. Da fehlen mir schlicht die Ideen.

Das mit "Perspective Transformation" von BGRABitmap hatte ich damals nach dem Tutorial Nr. 10 mal probiert gehabt. Werde ich mir nochmal ansehen.

Nochmal vielen, vielen Dank Euch Beiden.

Viele Grüße
Volker

ErnstVolker
Beiträge: 241
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Bitmap Pixel Koordinaten ändern

Beitrag von ErnstVolker »

Hallo ich bin's nochmal zu dem Thema.

Mit BGRABitmap habe ich nach Winnis Vorschlag eine Entzerrung hinbekommen die der mit OpenCV ähnlet bzw. identisches liefert. Das Ergebnis ist nicht pixelig (siehe Anhang). Allerdings kann nur innerhalb der Vier Punkte entzerrt werden.

Innerhalb von "FillQuadPerspectiveMapping" findet doch die Lösung des (eines ähnlichen?) Gleichungssystemes statt, welches in den Beiträgen hier mit "slegen" gelöst wird. Kommt man die Lösung ran und kann da irgendwie den Lösungsvektor zwischenspeichern?
Dann könnte man die Berechnung nochmal mit neuen Zielpunkten durclaufen lassen und vorher den zwischengespeicherten Lösungsvektor vorgeben.

Bin beim Stöbern im Netz auf Graphics32 gestoßen. Da gibt es auch Transformationen aber die scheinen mir für das Problem hier nicht zielführend sein, oder muß man sie nur entsprechend anpassen?

Viele Grüße

Volker
Dateianhänge
Vieleck_Laz.jpg

Benutzeravatar
six1
Beiträge: 207
Registriert: Do 1. Jul 2010, 19:01

Re: Bitmap Pixel Koordinaten ändern

Beitrag von six1 »

...vielleicht denke ich völlig falsch, aber deine Zeichnung soll doch einem 2D Bild entsprechen, welches unter einem bestimmten Winkel der Sicht aus einer 3D Umgebung entstand...
Versuchst du jetzt, unter nicht Berücksichtigung, des Sichtwinkels aus der 3D Welt das Bild in 2D zu entzerren?

Ich hoffe, ich konnte meine Gedanken einigermaßen verständlich rüber bringen...
Gruß, Michael

ErnstVolker
Beiträge: 241
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Bitmap Pixel Koordinaten ändern

Beitrag von ErnstVolker »

ich versuche eine perspektivische 2D Aufnahme in eine ebene 2D Aufnahme zu entzerren um die wahren Längen ausmessen zu können. Hier sind als Längen z.B. die Ellipse und/oder der Bogen interessant. Den Aufnahmewinkel und die Aufnahmehöhe sind nicht bekannt. Die Maße zwischen den äußeren Eckpunkten und die Diagonalen können bekannt sein und der Referenz dienen. Im allgemeinen würde man das zu fotografierende Areal einer Aufnahme so vermessen (Hütchen aufstellen, Kreuze aufsprühen etc.). Manchmal sind aber auch nur kleinere Bereiche in einem Bild als Referenz bekannt. Hier z.B. das rote Quadrat und man will trotzdem auf Bogen und Ellipse schließen können.

Benutzeravatar
six1
Beiträge: 207
Registriert: Do 1. Jul 2010, 19:01

Re: Bitmap Pixel Koordinaten ändern

Beitrag von six1 »

...und die Position der Aufnahmequelle zur 2D Aufnahme wäre doch aber eminent wichtig, oder nicht?
Sonst würde doch die Flucht verschiedener Objekte in der 2D Aufnahme nie stimmen nach meiner Meinung; naja, vielleicht habe ich einen Denkfehler...
Gruß, Michael

ErnstVolker
Beiträge: 241
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Bitmap Pixel Koordinaten ändern

Beitrag von ErnstVolker »

...sie stehen aber nicht zur Verfügung. Teilweise hat man die Bilder nicht mal selbst gefertigt sondern erkennt nur den ein oder anderen markten Punkt/Abstand auf dem Bild, den man nachträglich vermisst
Die Abstände zwischen den Referenzpunkten sind ca. 6 - 8 Meter. Das Testbild hier in den Beiträgen ist nur ein mit dem Smartphone hinter der Balkontür schnell geschossen um das Prinzip zu verdeutlichen.

Die in den Beiträgen vorgestellten Lösungen von Winni und wp_xyz funktionieren sehr gut. Gerade die von wp_xyz. Lediglich dem fertigen Bild mangelt es an Auflösung. Es ist etwas pixelig. Man kann aber im CAD die entsprechenden Linien nachzeichnen. So viel erkennt man.

Ich dachte mit der Graphics32 wären evtl. besser aufgelöste Bilder hinzubekommen, aber die ProjectiveTransformation https://graphics32.github.io/Docs/Units ... /_Body.htm scheint gerade das Gegenteil von dem zu machen was ich vorhabe.

wp_xyz
Beiträge: 3306
Registriert: Fr 8. Apr 2011, 09:01

Re: Bitmap Pixel Koordinaten ändern

Beitrag von wp_xyz »

ErnstVolker hat geschrieben:Die in den Beiträgen vorgestellten Lösungen von Winni und wp_xyz funktionieren sehr gut. Gerade die von wp_xyz. Lediglich dem fertigen Bild mangelt es an Auflösung. Es ist etwas pixelig.

Ich habe es nicht explizit erwähnt, aber ich hatte dein Originalbild durch Skalieren in einer Bildbearbeitung deutlich verkleinert, damit der Upload des Projekts ins Forum nicht zu groß wird. Das ist die Ursache für die Unschärfe.

ErnstVolker
Beiträge: 241
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Bitmap Pixel Koordinaten ändern

Beitrag von ErnstVolker »

Hallo,
ich nutze für meine Tests immer das Originalbild welches ich mit dem Smartphone aufgenommen hatte.
Auflösung 1920 X 1440 bei 96 dpi und eine Dateigröße von 678 kB als jpg-Bild.

Antworten