Bitmap Pixel Koordinaten ändern

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...

Re: Bitmap Pixel Koordinaten ändern

Beitragvon wp_xyz » 13. Feb 2020, 12:01 Re: Bitmap Pixel Koordinaten ändern

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) 8-mal heruntergeladen
wp_xyz
 
Beiträge: 3073
Registriert: 8. Apr 2011, 08:01

Beitragvon ErnstVolker » 13. Feb 2020, 19:18 Re: Bitmap Pixel Koordinaten ändern

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) 3-mal heruntergeladen
Zuletzt geändert von ErnstVolker am 13. Feb 2020, 22:34, insgesamt 1-mal geändert.
ErnstVolker
 
Beiträge: 236
Registriert: 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon Winni » 13. Feb 2020, 21:14 Re: Bitmap Pixel Koordinaten ändern

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) 10-mal heruntergeladen
Winni
 
Beiträge: 25
Registriert: 2. Mär 2009, 16:45
Wohnort: Fast Dänemark
OS, Lazarus, FPC: Laz2.06, fpc 3.04 | 
CPU-Target: 64Bit
Nach oben

Beitragvon ErnstVolker » 14. Feb 2020, 10:47 Re: Bitmap Pixel Koordinaten ändern

Wie kann man denn ein LazIntfImage vergrößern? Bei den BGRABitmap geht es mit Resample.
ErnstVolker
 
Beiträge: 236
Registriert: 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon Winni » 14. Feb 2020, 12:24 Re: Bitmap Pixel Koordinaten ändern

Mit

TLazCanvas.StretchDraw

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

Beitragvon wp_xyz » 14. Feb 2020, 12:34 Re: Bitmap Pixel Koordinaten ändern

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) 5-mal heruntergeladen
wp_xyz
 
Beiträge: 3073
Registriert: 8. Apr 2011, 08:01

Beitragvon ErnstVolker » 17. Feb 2020, 21:15 Re: Bitmap Pixel Koordinaten ändern

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: 236
Registriert: 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

• Themenende •
Vorherige

Zurück zu Multimedia



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried