Verschiebung und Zoomfaktor bestimmen

  • Hallo,


    ich bräuchte mal Rat mit welcher (möglichst kostenlosen) Software man folgendes Problem lösen kann:
    Gegeben sind zwei Bilder, Bild1 und Bild2. Der Bildinhalt kann irgendwas sein. Es können Sterne sein, oder was anderes.
    Bild1 wurde mit einem 50mm Objektiv aufgenommen und Bild2 mit einem 200mm Objektiv. Bild2 enthält einen Ausschnitt aus Bild1, aber dieser Ausschnitt muss nicht unbedingt genau in der Mitte von Bild1 liegen.
    Gesucht sind die Koordinaten der Eckpunkte des Ausschnitts in Bild1.
    Oder mit anderen Worten: Die Verschiebung und der Zoomfaktor.
    Der Einfachheit halber gehen wir mal davon aus, dass keine Verdrehung und Verzeichnung vorliegt.


    Gruß
    Michael

  • Hallo Michael,


    ich kenne jetzt keine fertige Software dafür, aber so was müsste man relativ leicht programmieren können. Hättest du zwei Beispielbilder?


    Grüße,
    Marcus

  • Hallo Marcus,


    <blockquote id="quote"><font size="1" face="Verdana, Arial, Helvetica" id="quote">Zitat:<hr height="1" noshade id="quote"><i>Original erstellt von: nuazo</i>
    ich kenne jetzt keine fertige Software dafür, aber so was müsste man relativ leicht programmieren können. Hättest du zwei Beispielbilder?
    <hr height="1" noshade id="quote"></blockquote id="quote"></font id="quote">


    Die Bilder sind PNG mit der Auflösung 5472x3648. Also zu groß um es hier hochzuladen. Ich kann dir aber gerne ein Bild per email schicken. Das zweite Bild kann man sich problemlos mit IrfanView machen, indem man einen Auschnitt auswählt und dann wieder auf das ursprüngliche Format hochvergrößert.
    Mit welcher Programmiersprache würdest du das machen?


    Wozu ich das brauche:
    Ich möchte eine tiefe Zoom-Fahrt über mehrere Bilder machen, die mit unterschiedlichen Brennweiten aufgenommen wurden. Also mit einem Weitwinkel-Bild anfangen, und dann hineinzoomen und wenn ungefähr ein Zoomfaktor 3 erreicht ist dann wird in das nächste Bild übergeblendet. Damit der Übergang nicht sichtbar ist, muss man den Zoomfaktor und die Verschiebung vorher genau kennen.
    Das Video wird dann mit FFmpeg erzeugt.


    Gruß
    Michael

  • Hallo Michael,


    das geht mit Fitswork:
    Lade beide Bilder, markiere das grosse, dann abwechselnd 2 identische Sterne in beiden Bildern markieren (möglichst weit auseinander).
    Wenn du dann '-&gt;Bilder kombinieren-&gt;Bilder addieren (mit Verschiebung)' machst, siehst du im grossen Bild das kleine Bild liegen. Die Koordinaten der Ecken des kleinen Bilds kannst du dann mit dem Cursor rauslesen (den kannst du punktgenau mit den Cursorsteuertasten auf die Ecken positionieren).


    Gruss
    Günter

  • Hallo Günter,


    <blockquote id="quote"><font size="1" face="Verdana, Arial, Helvetica" id="quote">Zitat:<hr height="1" noshade id="quote"><i>Original erstellt von: gscholz</i>
    das geht mit Fitswork:
    Lade beide Bilder, markiere das grosse, dann abwechselnd 2 identische Sterne in beiden Bildern markieren.
    Wenn du dann '-&gt;Bilder kombinieren-&gt;Bilder addieren (mit Verschiebung)' machst, siehst du im grossen Bild das kleine Bild liegen. Die Koordinaten der Ecken des kleinen Bilds kannst du dann mit dem Cursor rauslesen (den kannst du punktgenau mit den Cursorsteuertasten auf die Ecken positionieren).
    <hr height="1" noshade id="quote"></blockquote id="quote"></font id="quote">


    Mit Fitswork kenne ich mich noch nicht aus. Mit Cursor rauslesen hört sich nicht so genau an. Besteht vielleicht die Möglichkeit die Verschiebung und den Zoomfaktor angezeigt zu bekommen?
    Das wird aber vermutlich nur funktionieren, wenn es in den Bildern Punkte gibt die man genau markieren kann, oder? Eigentlich suche ich eine Lösung die auch bei Bildern funktioniert die keine Sterne enthalten.

    Gruß
    Michael

  • Hallo Michael,


    Der Zoomausschnitt der Werkzeugleiste macht es leicht, genau auf das Eckpixel zu positionieren.
    Alle weiteren Daten, die du brauchst (Zoomfaktor, Verschiebung, Drehung) sind dann leicht zu berechnen.


    Du willst Bilder ohne zuordnbare gleiche Objekte vergleichen? Wie soll das gehen?
    Es müssen ja keine Sterne sein, aber ortsgenau definierbare Strukturen braucht Fitswork schon.


    Gruss
    Günter

  • Hey Michael,


    ich hab's einfach mal mit einem Testbild von mir probiert:

    Externer Inhalt youtu.be
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

    Volle Auflösung genommen, ein (rotiertes) crop erstellt und wieder auf die volle Auflösung skaliert. Ein Astrofoto hab ich auch gerade noch mal getestet. Scheint zu funktionieren.
    Die Vier Eckpunkte kann ich auch mit ausgeben. Würde das passen?


    Habe das Programm unter Linux in Python geschrieben und könnte es eventuell auch für Windows kompilieren.


    Grüße,
    Marcus

  • Hallo Marcus,


    <blockquote id="quote"><font size="1" face="Verdana, Arial, Helvetica" id="quote">Zitat:<hr height="1" noshade id="quote"><i>Original erstellt von: nuazo</i>
    ich hab's einfach mal mit einem Testbild von mir probiert:

    Externer Inhalt youtu.be
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

    Volle Auflösung genommen, ein (rotiertes) crop erstellt und wieder auf die volle Auflösung skaliert. Ein Astrofoto hab ich auch gerade noch mal getestet. Scheint zu funktionieren.
    Die Vier Eckpunkte kann ich auch mit ausgeben. Würde das passen?


    Habe das Programm unter Linux in Python geschrieben und könnte es eventuell auch für Windows kompilieren.
    <hr height="1" noshade id="quote"></blockquote id="quote"></font id="quote">


    Wow, das ging ja schnell. Sieht gut aus. Läuft das über Kreuzkorrelation?
    Also optimal wäre es wenn die Ausgabe besteht aus:
    -- Koordinaten der Mitte des Ausschnitts
    -- Zoomfaktor ( = Bildbreite1 / Bildbreite2)
    -- Drehwinkel
    Und ja, ich würde es für Windows brauchen.


    Gruß
    Michael

  • Hey Michael,


    hab's zusammen mit meinen beiden Testbildern mal hochgeladen: https://www.dropbox.com/s/lx8r…/templatematching.7z?dl=0
    Ist nur ein quick'n'dirty Konsolenprogramm. Einfach Konsole im Ordner mit der exe öffnen (Shift + Rechtsklick auf den Ordner -&gt; Eingabeaufforderung hier öffnen), dann templatematching.exe bild1.jpg crop.jpg dann sollte es durchlaufen und ein schwarzweiß Bild anzeigen, auf dem die gefundenen Punkte angezeigt werden und bei Tastendruck den gefundenen Bereich im großen Bild anzeigen. Die Daten stehen dann in der Konsole. Wenn es nicht funzt (fehlende Bibliotheken usw.), gib einfach Bescheid :)


    Grüße,
    Marcus

  • Hi Marcus,


    mit deinen Bildern läuft es problemlos, aber mit meinen Beispielbildern findet es leider nicht das richtige Ergebnis.
    Das korrekte Ergebnis ist: Zoom=3.00 Mittelpunkt=2736,1824 (also genau mittig), Verdrehung=0. Ich versuche die Bilder hochzuladen.


    Gruß
    Michael


    P.S. Ich hatte es zunächst mit JPG Bildern getestet die sehr groß waren, über 10MB. Das ging nicht. Die gleichen Bilder mit stärkerer Komprimierung (2.5MB): geht! Die gleichen Bilder als PNG: geht auch!

  • <blockquote id="quote"><font size="1" face="Verdana, Arial, Helvetica" id="quote">Zitat:<hr height="1" noshade id="quote"><i>Original erstellt von: nuazo</i>
    <br />Hey Michael,


    funktioniert es generell nicht (crop wird nicht gefunden) oder kommen einfach nur falsche Ergebnisse heraus?


    Grüße,
    Marcus
    <hr height="1" noshade id="quote"></blockquote id="quote"></font id="quote">


    Es kommen nur falsche Ergebnisse raus. Ich reiche die Bilder gleich nach, dann kannst du es ausprobieren.


    Gruß
    Michael


    Bild1: http://img5.fotos-hochladen.net/uploads/baum0vbhs9m8xf.jpg
    Bild2: http://img5.fotos-hochladen.net/uploads/baum3x0gkdsiyfo8.jpg
    Wie gesagt, wenn du die Bilder stärker komprimierst oder in PNG umwandelst, dann geht es.

  • Hm komisch, wenn ich es unter Linux durchlaufen lasse, kommt das richtige Ergebnis heraus (mit Rundungsfehlern etc.):


    ['baum0vbhs9m8xf.jpg', 'baum0vbhs9m8xf_crop.jpg']
    1825.79003448
    middlepoint: [ 2736.70727539 1823.29125977]
    zoom: 2.99705875082
    angle: 0.051875789637
    corners:
    [ 1824.86328125 1217.38879395]
    [ 1821.55322266 2431.09545898]
    [ 3651.73803711 2431.20019531]
    [ 3650.65258789 1215.73571777]


    Unter Windows kommt nur Mist heraus. Ich schaue es mir heute Abend noch mal an.


    Grüße,
    Marcus

  • Hi Marcus,


    könntest du das Programm noch so erweitern dass die Ergebnisse in eine Datei geschrieben werden? Am besten so dass falls die Datei schon existiert, dass dann am Ende die neuen Ergebnisse hinzugefügt werden. Dann könnte man das Programm gleich mehrfach mit unterschiedlichen Bildern aufrufen und hat hinterher alle Ergebnisse in einer Datei.


    Leerzeile
    Dateiname1, Dateiname2
    Koordinaten des Zentrums
    Zoomfaktor
    Drehwinkel


    Wirft das Programm vielleicht auch noch sowas wie den Korrelationsgrad aus, also ein Maß dafür wie zuverlässig die Ergebnisse sind?

    Gruß
    Michael

  • Hey Michael,


    anbei noch mal eine neue Version, die die Daten automatisch in der Datei results.txt ablegt: https://www.dropbox.com/s/kpxc…templatematching.exe?dl=0


    Habe das Ganze jetzt noch mal mit deinen Bildern probiert. Unter Linux läuft es einwandfrei durch, unter Windows wird mittlerweile auch der richtige Bereich erkannt, wobei sich die Ergebnisse leicht unterscheiden (ca. 1 Pixel). Woher der Unterschied kommt, kann ich nicht sagen. Eventuell wegen unterschiedlichen 32/64 bit Versionen der Bibliotheken?


    Ich nutze den ORB Detektor und einen Brute-Force-Matcher aus der OpenCV Bibliothek um übereinstimmende Features in beiden Bildern zu finden. Ich nehme jetzt nur noch die 10 am besten passendsten Punkte. Dadurch sollte das Ergebnis besser werden. Ich habe mich dabei an dem OpenCV Beispielcode orientiert: http://docs.opencv.org/3.0-bet…y_matcher/py_matcher.html (erster Codeblock: Brute-Force Matching with ORB Deskriptors). Zur Sortierung der übereinstimmenden Punkte kann ich einen "Distance" Wert für jeden Punkt auslesen. Ich glaube, dabei handelt es sich um die Hamming-Distanz / Hamming-Abstand. Wenn dir das was bringt, die Zuverlässigkeit einzuschätzen, kann ich die Werte oder einen Mittelwert daraus ausgeben.


    Grüße,
    Marcus

  • Hi Marcus,


    ich habe die neue Version getestet, aber sie macht noch Probleme. Ich habe jetzt das gleiche Bild1 verwendet, und als Bild2 einen Ausschnitt mit Zoomfaktor 3.2, Drehwinkel 0, Mitte bei 3855,1370, linke obere Ecke bei 3000,800.
    Hier das Ergebnis:
    &lt;ORB 004C78A0&gt;
    22.0
    23.0
    25.0
    30.0
    35.0
    37.0
    41.0
    42.0
    43.0
    44.0
    B0000.png B0001.png
    middlepoint: [ 3862. 1369.50036621]
    zoom: 3.05896429401
    angle: 0.676401646627
    corners:
    [ 2994.90942383 789.67468262] oben links
    [ 3007.94555664 1925.88305664] unten links
    [ 4718.4375 1942.09606934] unten rechts
    [ 4783.62548828 768.55712891] oben rechts


    Die Mitte wird ganz gut gefunden, aber der Zoomfaktor ist falsch.
    Es fällt auf, dass die vier Punkte kein exaktes Rechteck ergeben.
    Die obere Kante hat die Länge 1788.84 und die untere Kante 1710.58
    Offensichtlich versucht der Algorithmus, den Bereich zu verzerren.


    Würde der Algorithmus vielleicht zuverlässiger arbeiten, wenn man ihm noch ein paar Randbedingungen gibt?
    -- Die Verdrehung soll Null sein und nicht gesucht werden.
    -- Der gesuchte Bereich soll rechteckig sein und das gleiche Höhen/Seiten Verhältnis haben wie die beiden Bilder.
    -- Der Zoomfaktor ist vorab bekannt mit +-10% Toleranz. Ich weiss ja mit welchen Objektiven ich die Bilder gemacht habe. Eine Toleranz muss sein weil auch Zoom-Objektive dabei sind, wo man die Brennweite nicht so genau kennt.

    Gruß
    Michael

  • Hey Gert,


    ja die template-match Funktion könnte ich auch mal probieren. Problem ist, dass das Template nur mit der vorhandenen Größe über das Bild gelegt wird. Aber wenn man einen ungefähren Zoomfaktor eingibt, könnte ich das Bild ja im Bereich von +/- 10% in kleinen Schritten skalieren und schauen, bei welcher Skalierung und Position es am besten passt. Würde dann nur bei rotierten Bildern nicht mehr funktionieren, aber das ist ja auch nicht gewollt. Die bisher verwendeten Funktionen können auch Rotation und perspektivische Änderungen erkennen, aber das scheint bei unserer Problemstellung eher Fehler zu erzeugen.
    Ich setze mich morgen noch mal hin und probiere es damit [:)]



    Grüße,
    Marcus

  • Hi Marcus,


    inzwischen habe ich das Batchfile für FFmpeg soweit fertig dass es läuft. Man muss einfach die entsprechenden Daten eintragen und es durchlaufen lassen. Zum Schluss kommt das fertige MP4 Video raus. Wenn man mehr als 3 Bilder hat, kann man das Batchfile sinngemäß erweitern. Die Dateinamen der Eingangs-Bilder müssen sein: B0000.png, B0001.png, B0002.png u.s.w. Es macht nichts, wenn weniger Bilder vorhanden sind als im Batchfile drinstehen. FFmpeg hört einfach auf wenn kein Bild mehr gefunden wird.


    Es hat sich herausgestellt dass es günstiger ist nicht die Koordinaten des Ausschnitt-Zentrums anzugeben, sondern die Koordinaten der linken oberen Ecke.


    Gruß
    Michael



    P.S. Für Linux im FFmpeg-Programmaufruf das doppelte %% durch ein einfaches % ersetzen.

  • hallo,


    wie Günter weiter oben bereits geschrieben hat, kann man mit Fitswork die Verschiebung und den Zoomfaktor bestimmen. Allerdings ist das ziemlich viel Handarbeit. Das geht so:


    Beide Bilder in Fitswork laden, in beiden Bildern jeweils zwei gleiche Sterne markieren die möglichst in gegenüberliegenden Ecken des Bildes liegen sollen.
    Wenn man beim Markieren mit der linken Maustaste die "L" Taste gedrückt hält, wird die Markierung exakt auf den Stern zentriert. Die Koordinaten werden rechts oben bei "Locked PSF" angezeigt.
    Dann "Bilder addieren (mit Verschiebung)", und anschliessend die Koordinaten der Eckpunkte des Ausschnitts mit dem Cursor auslesen.
    Ein Problem kann dabei sein, dass man die Eckpunkte nicht gut sehen kann, weil sie schwarz sind.


    Alternativ kan man auch direkt aus den Stern-Koordinaten die Verschiebung und den Zoomfaktor berechnen. Mit Fitswork werden die Koordinaten der Sterne ermittelt und aufgeschrieben.
    Im Bild das den kleineren Ausschnitt zeigt (grössere Brennweite):

    Code
    Stern1 x1,y1  Stern2 x2,y2


    Im Bild das den grösseren Ausschnitt zeigt (kleinere Brennweite):

    Code
    Stern1 u1,v1  Stern2 u2,v2


    Der Zoomfaktor wird so berechnet:

    Code
    zoom_x = (x1-x2) / (u1-u2)  und  zoom_y = (y1-y2) / (v1-v2)


    Theoretisch sollten beide Werte gleich sein. Falls sie sich um mehr als 1% unterscheiden, dann stimmt irgendwas nicht.
    Wir verwenden den Mittelwert:

    Code
    zoom = (zoom_x + zoom_y) / 2


    Nun kann man die Verschiebung bestimmen, also die Koordinaten der linken oberen Ecke des Ausschnitts:

    Code
    x_1 = u1-x1/zoom   und   x_2 = u2-x2/zoom 
    y_1 = v1-y1/zoom   und   y_2 = v2-y2/zoom


    Theoretisch sollte x_1=x_2 und y_1=y_2 sein. Bei Abweichungen von mehr als einigen Pixeln stimmt irgendwas nicht.


    Man verwendet sinnvollerweise die Mittelwerte:

    Code
    x = (x_1+x_2)/2
    y = (y_1+y_2)/2


    Diese Werte für zoom, x und y werden für jedes Bild-Paar in das Batchfile eingetragen, das ich weiter oben bereits gepostet habe.
    Und dann sollte das fertige MP4 Video herauskommen.


    Der Teufel steckt allerdings im Detail, und im Moment schlage ich mich noch mit der Korrektur der unterschiedlichen Hintergrund-Helligkeit und Verzeichnung herum.


    Gruß
    Michael

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!