Hypothraxer
2012-02-21, 15:59:08
Die Situation ist folgendermassen:
Ich habe einen Algorithmus, der mir jeweils zwischen zwei Bildern, automatisch die identischen Punkte findet. Die Punkte werden als <Punktnummer> <X in Pixel> <Y in Pixel> abgespeichert.
Die Messungen speichere ich jeweils in zwei Dateien ab. Da ich meistens mehr als nur ein Bildpaar habe, sieht die Datei-Namensgebung so aus:
Bildpaar_bildname.txt
Wenn ich also Bild1.jpg und Bild2.jpg prozessiert habe, erhalte ich die Dateien:
0_Bild1.jpg.txt
0_Bild2.jpg.txt
Die Punktnummerierung ist jeweils abhängig vom Bildpaar. Bei Bildpaar 0 beginnt die Nummerierung bei 0 und geht bis N. Bei Bildpaar 1 geht es von N + 1 bis M usw.
Jetzt wäre die Idee, dass ich zum Schluss alle Bildmessungen von einem Bild in eine Datei schreibe. Konkret für folgendes Beispiel:
0_Bild1.jpg.txt
0_Bild2.jpg.txt
1_Bild2.jpg.txt
1_Bild3.jpg.txt
2_Bild1.jpg.txt
2_Bild3.jpg.txt
3_Bild2.jpg.txt
3_Bild4.jpg.txt
4_Bild3.jpg.txt
4_Bild4.jpg.txt
5_Bild2.jpg.txt
5_Bild3.jpg.txt
Will ich am Schluss vier Dateien haben:
Bild1.jpg.txt
Bild2.jpg.txt
Bild3.jpg.txt
Bild4.jpg.txt
In diesen stehen alle Bildmessungen der jeweiligen Datei drin. Jetzt ist es so, dass in diesen Dateien Duplikate auftauchen - weil ein Punkt in mehr als zwei Bildern gemessen werden kann.
Beispiel (für einen identischen Punkt im Objekt)
Punkt 20 ist in Bild1 und Bild2 gemessen (in Bild1 und Bild2 hat er die Punktnummer 20)
Punkt 80 ist in Bild1 und Bild3 gemessen (in Bild1 und Bild3 hat er die Punktnummer 80)
Punkt 240 ist in Bild2 und Bild3 gemessen (in Bild1 und Bild3 hat er die Punktnummer 240)
Der Punkt hat in Bild1 die ~gleiche Koordinate (euklidische Distanz <= 1.5 pixel). D.h. der Punkt kommt in Bild1 zweimal vor. Somit muss der Koordinaten-Wert (X/Y) in Bild1 gemittelt/der median gemittelt werden und ein Eintrag gelöscht werden. Zusätzlich kommt der Punkt in Bild2 ebenfalls zweimal vor (20 & 240) muss ebenfalls gemittelt werden und die Nummer auf 20 gesetzt werden (und ein Eintrag raus). In Bild 3 sind ebenfalls zwei Punkte identisch (80 & 240) - auch hier wiederum: Mittelung und Koordinatensetzen auf '20' und Entfernen eines Eintrages.
Und so rasselt es sich dann zusammen.
Mein Problem ist jetzt, dass ich keine Implementation hinkriege die a) einigermassen rasant und b) speichereffizient ist. Momentan verfahre ich so, dass ich die einzelnen Dateien (Bild1.jpg.txt, Bild2.jpg.txt, ...) generiere und dann in der jeweiligen Bilddatei cluster erstelle - in diesen Clustern befinden sich die jeweiligen identischen/ähnlichen Koordinaten. Ich ersetze dann jeweils die Punktnummern (d.h. ein Cluster = eine Punktnummer) und sehe nach ob in den entsprechenden verknüpften bildern die Koordinaten ebenfalls in einem Cluster sitzen (mehrfach gemessene Punkte).
Das funktioniert +/- o.k. (Falschmessungen werden nicht abgefangen und so ganz korrekt scheint es nicht zu sein) - aber bei recht grossen Datensätzen (~4.5 Millionen Punkte, 55 Bilder) überläuft mir der 16 GiB grosse Arbeitsspeicher recht schnell.
Jetzt die Frage: Hat jemand eine Idee, wie das Ganze effizient und speicherschonend gemacht werden könnte?
Ein kleiner Beispieldatensatz (~3 MiB) (http://n.ethz.ch/~dnovak/download/MT_small.zip)
Ein grosser Beispieldatensatz (~73 MiB) (http://n.ethz.ch/~dnovak/download/MT.zip)
Ich habe einen Algorithmus, der mir jeweils zwischen zwei Bildern, automatisch die identischen Punkte findet. Die Punkte werden als <Punktnummer> <X in Pixel> <Y in Pixel> abgespeichert.
Die Messungen speichere ich jeweils in zwei Dateien ab. Da ich meistens mehr als nur ein Bildpaar habe, sieht die Datei-Namensgebung so aus:
Bildpaar_bildname.txt
Wenn ich also Bild1.jpg und Bild2.jpg prozessiert habe, erhalte ich die Dateien:
0_Bild1.jpg.txt
0_Bild2.jpg.txt
Die Punktnummerierung ist jeweils abhängig vom Bildpaar. Bei Bildpaar 0 beginnt die Nummerierung bei 0 und geht bis N. Bei Bildpaar 1 geht es von N + 1 bis M usw.
Jetzt wäre die Idee, dass ich zum Schluss alle Bildmessungen von einem Bild in eine Datei schreibe. Konkret für folgendes Beispiel:
0_Bild1.jpg.txt
0_Bild2.jpg.txt
1_Bild2.jpg.txt
1_Bild3.jpg.txt
2_Bild1.jpg.txt
2_Bild3.jpg.txt
3_Bild2.jpg.txt
3_Bild4.jpg.txt
4_Bild3.jpg.txt
4_Bild4.jpg.txt
5_Bild2.jpg.txt
5_Bild3.jpg.txt
Will ich am Schluss vier Dateien haben:
Bild1.jpg.txt
Bild2.jpg.txt
Bild3.jpg.txt
Bild4.jpg.txt
In diesen stehen alle Bildmessungen der jeweiligen Datei drin. Jetzt ist es so, dass in diesen Dateien Duplikate auftauchen - weil ein Punkt in mehr als zwei Bildern gemessen werden kann.
Beispiel (für einen identischen Punkt im Objekt)
Punkt 20 ist in Bild1 und Bild2 gemessen (in Bild1 und Bild2 hat er die Punktnummer 20)
Punkt 80 ist in Bild1 und Bild3 gemessen (in Bild1 und Bild3 hat er die Punktnummer 80)
Punkt 240 ist in Bild2 und Bild3 gemessen (in Bild1 und Bild3 hat er die Punktnummer 240)
Der Punkt hat in Bild1 die ~gleiche Koordinate (euklidische Distanz <= 1.5 pixel). D.h. der Punkt kommt in Bild1 zweimal vor. Somit muss der Koordinaten-Wert (X/Y) in Bild1 gemittelt/der median gemittelt werden und ein Eintrag gelöscht werden. Zusätzlich kommt der Punkt in Bild2 ebenfalls zweimal vor (20 & 240) muss ebenfalls gemittelt werden und die Nummer auf 20 gesetzt werden (und ein Eintrag raus). In Bild 3 sind ebenfalls zwei Punkte identisch (80 & 240) - auch hier wiederum: Mittelung und Koordinatensetzen auf '20' und Entfernen eines Eintrages.
Und so rasselt es sich dann zusammen.
Mein Problem ist jetzt, dass ich keine Implementation hinkriege die a) einigermassen rasant und b) speichereffizient ist. Momentan verfahre ich so, dass ich die einzelnen Dateien (Bild1.jpg.txt, Bild2.jpg.txt, ...) generiere und dann in der jeweiligen Bilddatei cluster erstelle - in diesen Clustern befinden sich die jeweiligen identischen/ähnlichen Koordinaten. Ich ersetze dann jeweils die Punktnummern (d.h. ein Cluster = eine Punktnummer) und sehe nach ob in den entsprechenden verknüpften bildern die Koordinaten ebenfalls in einem Cluster sitzen (mehrfach gemessene Punkte).
Das funktioniert +/- o.k. (Falschmessungen werden nicht abgefangen und so ganz korrekt scheint es nicht zu sein) - aber bei recht grossen Datensätzen (~4.5 Millionen Punkte, 55 Bilder) überläuft mir der 16 GiB grosse Arbeitsspeicher recht schnell.
Jetzt die Frage: Hat jemand eine Idee, wie das Ganze effizient und speicherschonend gemacht werden könnte?
Ein kleiner Beispieldatensatz (~3 MiB) (http://n.ethz.ch/~dnovak/download/MT_small.zip)
Ein grosser Beispieldatensatz (~73 MiB) (http://n.ethz.ch/~dnovak/download/MT.zip)