Bildverarbeitung von Line-Scan-Kameraaufnahmen für die Zugfotografie
(daniel.lawrence.lu)- Line-Scan-Kameras eignen sich sehr gut dafür, bewegte Objekte wie Züge hochauflösend und ohne Verzerrungen aufzunehmen
- Für die Bildverarbeitung werden verschiedene Algorithmen und Verfahren benötigt, etwa Erkennung von Regions of Interest, Geschwindigkeitsschätzung und Resampling
- Maßnahmen zur Qualitätsverbesserung wie das Entfernen horizontaler und vertikaler Streifen sowie Rauschunterdrückung sind wichtig
- Die Implementierung umfasst die Verarbeitung großer Datenmengen, den Einsatz von Python, numpy und verschiedene experimentelle Verbesserungen
- Der Vergleich mit Beispielen von Line-Scan-Fotos anderer Fotografen kann zusätzliche Erkenntnisse liefern
Überblick über Line-Scan-Kameras
- Eine Line-Scan-Kamera scannt Bilder mit einer oder zwei Pixelzeilen mit sehr hoher Geschwindigkeit
- Die Kamera ist fest montiert, und während der Zug an ihr vorbeifährt, wird seine gesamte Form aufgezeichnet
- Ein statischer Hintergrund wiederholt sich in allen vertikalen Spalten des Bildes, wodurch der charakteristische Streifeneffekt entsteht
- Dieses Verfahren ermöglicht hochauflösende Fotos ohne Verzerrung über die gesamte Zuglänge hinweg und ist daher auch für Hobbys wie Zugmodellierung nützlich
- Auch filmbasierte Strip-Kameras arbeiten nach einem ähnlichen Prinzip, unterscheiden sich jedoch dadurch, dass wegen Empfindlichkeitsproblemen die Filmgeschwindigkeit manuell angepasst werden muss
Kameraausrüstung
- Verwendet wird das Modell [Alkeria Necta N4K2-7C] mit einem 4096×2 doppelten Bayer-Array-Bildsensor
- Die Rohdaten werden als 16-Bit-Binärarray gespeichert
- Die Aufnahmen entstehen in verschiedensten Umgebungen, darunter städtische U-Bahnen
Erkennung von Regions of Interest (ROI)
- Bei langen Scans fallen große Mengen an Hintergrunddaten an, daher ist ein Algorithmus zur automatischen Erkennung bewegter Objektbereiche unverzichtbar
- Durch die Kombination einer Energiefunktion (gradientenbasiert) mit maximalen Pixelwerten werden vertikale Strukturen (Bewegung) und horizontale Strukturen (Hintergrund) unterschieden
- Das Bild wird in mehrere Chunks aufgeteilt, und für jeden Chunk wird anhand der 99. Perzentil-Energie ein Score berechnet
- Chunks mit einem Score von mindestens dem 1,5-Fachen des Minimums gelten als Bereiche mit bewegten Objekten
- Frühere Verfahren ließen sich nicht gut verallgemeinern; der aktuelle Ansatz arbeitet in unterschiedlichen Situationen effizienter
Geschwindigkeitsschätzung
- Wenn sich das Motiv bewegt, führen Fehler bei der Geschwindigkeitsschätzung zu Verzerrungen, bei denen das Bild gestreckt oder gestaucht wird
- Durch den Vergleich der beiden grünen Kanäle der Kamera wird für jeden Chunk die Bewegungsgeschwindigkeit berechnet
- Für jeden Chunk werden kleine Verschiebungen von -7 bis +7 angewendet, anschließend wird aus dem Absolutwert der Kanalunterschiede ein Cost-Array erzeugt
- Um einen Subpixel-Peak zu finden, wird eine gaußbasierte Interpolation im Stil von [mean shift] verwendet; per Spline wird die Gesamtänderung korrigiert
- Die extrahierten Spline-Werte entsprechen dem Sample-Abstand in der ursprünglichen Zeitreihe und werden zur Korrektur der Bildverzerrung genutzt
Resampling
- Entsprechend dem Spline werden die Sample-Positionen berechnet und daraus ein neues Bild extrahiert
- Ausnahmefälle werden berücksichtigt, etwa Spiegelung bei negativem Spline oder Fehlerbehandlung bei Werten nahe 0
- Für jede Sample-Position wird auch die Sample-Breite gespeichert; mit geeigneten Windowing-Funktionen wie dem Hann-Fenster wird die Anti-Aliasing-Leistung verbessert
- Eine einfache Spaltenauswahl oder ein rechteckiges Fenster ist ungeeignet, da beim Upsampling grobe Artefakte entstehen
Demosaicing
- Wegen des räumlichen Offsets des 2-Spalten-Bayer-Arrays ist ein benutzerdefiniertes Demosaicing mit bilinearer Interpolation erforderlich
- Nach der Geschwindigkeitsschätzung werden per linearer Interpolation Effekte wie Fringing korrigiert
- Aufgrund der Unterschiede zwischen den beiden grünen Kanälen könnte sogar eine bessere Vollfarbwiederherstellung möglich sein als bei einem normalen Bayer-Array
Entfernen vertikaler Streifen
- Durch Clock-Jitter (stripes) und Änderungen der Motivhelligkeit entstehen vertikale Streifen im Bild
- Mithilfe linearer Regression und gaußscher Gewichtung werden Streifen mit einer spaltenweisen Korrekturfunktion (iteratively reweighted least squares) korrigiert
- Diese Korrekturfunktionen bilden eine mathematische Gruppenstruktur; um Drift bei kumulierter Korrektur zu vermeiden, wird ein banddiagonales lineares Gleichungssystem als Lösungsansatz erwogen
- In der Praxis lässt sich hochfrequentes Rauschen auch mit exponentiellen Glättungsfiltern unterdrücken
- Die Streifenkorrektur muss unbedingt vor der Geschwindigkeitsschätzung erfolgen
Rauschunterdrückung
- Es wird ein patchbasiertes Verfahren zur Rauschkontrolle (block matching) eingesetzt, das die sich wiederholenden Texturen der Zugoberflächen aktiv ausnutzt
- Dabei werden Feature-Vektoren von 3×3-Pixel-Patches verwendet, und das Rauschen wird durch gewichtete Mittelwerte innerhalb ähnlicher Patches reduziert
- Je nach Signalstärke verbessert ein Vorverarbeitungsschritt mit Poisson-Verteilung (Wurzeltransformation) vor dem Vergleich die Leistung
- Das bisherige Verfahren des Total-Variation-Denoising ist ungeeignet, da dabei zu viel Textur verloren geht
- Dieses Verfahren hat den Nachteil eines hohen Rechenaufwands und geringer Geschwindigkeit
Korrektur der Schieflage (Skew)
- Wenn die Kamera nicht vertikal ausgerichtet ist, wirkt das gesamte Bild leicht schief
- Die Skew-Erkennung sollte nach der Geschwindigkeitsschätzung und vor dem endgültigen Resampling erfolgen, um Informationsverlust zu minimieren
- Eine automatische Erkennung anhand vertikaler Strukturen ist z. B. per Hough-Transformation möglich
Farbkorrektur
- Derzeit wird die Farbanmutung mit einer manuellen Korrekturmatrix angepasst
- In der Praxis ist die Qualität, etwa bei natürlichen Hauttönen, bereits recht gut
Implementierungsdetails
- Die gesamte Pipeline ist in Python und numpy implementiert
- Wegen der großen Datenmengen (4096 Zeilen × mehrere hunderttausend Spalten) wurde zur Vermeidung von Speicherengpässen eine stufenweise Verarbeitung in Chunks gewählt
- Da eine vollständige Speicherallokation auf einmal nicht praktikabel ist, werden die Daten in jeder Stufe teilweise verarbeitet und gespeichert
Erfahrungen bei der Implementierung
- Es wurde versucht, AI-Tools für die Code-Implementierung einzusetzen, die Ergebnisse waren jedoch begrenzt
- Häufig erzeugte die AI ineffizienten Code, etwa indem sie lineare Probleme mit unnötiger quadratischer Zeitkomplexität behandelte
- Bei der Verarbeitung großer Arrays traten Speicherprobleme auf, etwa durch die unnötige Erzeugung vollständiger Masken
- Bei manchen APIs, der Code-Strukturierung oder der Visualisierung mit Matplotlib konnte AI jedoch hilfreich zur Effizienzsteigerung beitragen
Beispiele für Line-Scan-Zugfotos anderer
Adam Magyar
- [Adam Magyar] hat mit einer eigenen Schwarzweiß-Line-Scan-Kamera die Projekte "Stainless" und "Urban Flow" umgesetzt
- Selbst in lichtarmen Umgebungen wie U-Bahn-Innenräumen erzielte er sehr saubere Ergebnisse
- Für die Aufnahmeposition ist es wichtig, Flackern der U-Bahn-Beleuchtung zu vermeiden
KR64-Blog
- Auf [kr64.seesaa.net] ist eine große Zahl verschiedener Line-Scan-Zugfotos aus ganz Japan veröffentlicht
- Vermutlich basieren sie auf einer Film-Slit-Scan-Kamera und weisen eine sehr hohe Vielfalt und Qualität auf
- Die Website ist wegen technischer Probleme oft nicht erreichbar, eine Kontaktaufnahme ist nicht möglich
1 Kommentare
Hacker-News-Kommentare
Ich mag diese Idee auch sehr und habe versucht, mit einer ähnlichen Methode per Drohne den größten Baum in Neuengland zu scannen. Das Ergebnis war nicht besonders gut, aber vielleicht versuche ich es noch einmal.
Ergebnis
Dieses Projekt war Teil dieser Geschichte.
Ich nutze einen ähnlichen Prozess, filme aber mit einer normalen Kamera und setze die Frames manuell zu einer Animation zusammen.
Das Besondere an dieser Methode ist, dass der Fokus sich ganz natürlich auf das Motiv richtet, während der Hintergrund in abstrakte Muster verwandelt wird.
Jede „Linie“ ist ungefähr 15 px breit.
Beispiel 1 Beispiel 2 Beispiel 3
Ich habe auch eine Sunset-Timelapse der Skyline von Tokio aufgenommen, eine ähnliche Technik angewendet und dann Motion Tracking eingesetzt, damit die Zeit im Frame von links nach rechts fließt.
Hier ist jede Zeile 4 Pixel breit, und die Originalanimation hat 8K-Auflösung.
Zugehöriges Video Motion Tracking
Ich habe nach weiteren Beispielen von Line-Scan-Zügen gesucht, hier zu finden.
Das erinnert mich an frühe Experimente, bei denen Flachbettscanner wie ein Digitalrückteil verwendet wurden.
Beispiel: Link
Ich frage mich, wie es aussehen würde, bewegte Landschaften aus einem Auto oder Zug mit einer Line-Scan-Kamera aufzunehmen. Ich vermute, dass durch den Parallaxeneffekt interessante Verzerrungen entstehen könnten.
Osaka Nankai 6000 Series: Foto
Französische Landschaft: Foto 1
Marseille: Foto 2
Kalifornien: Foto 3 Foto 4
Die violetten Bäume sehen so aus, weil die Kamera empfindlich für nahes Infrarot ist. Seit ich einen IR-Cut-Filter gekauft habe, konnte ich keine Zugfotos mehr machen. Einige Bilder haben auch Frame-Drops oder andere Artefakte.
Bei hoher Geschwindigkeit wie im Auto oder Zug sieht es nicht gut aus; für brauchbare Verzerrungen muss die Bewegung sehr langsam sein.
Wirklich ein interessanter Artikel, besonders das Cable-Car-Foto fand ich beeindruckend.
Auch die Frage, wie man den Hintergrundinhalt auswählen sollte, ist spannend.
Soweit ich mich erinnere, hat Omega bei den letzten Olympischen Spielen am Zielstreifen eine hochfrequente Linienanzeige mit der Strip-Kamera kombiniert.
Auf normalen Kameras sah das wie blinkende Linien aus, aber im Fotofinish-Hintergrund war das Omega-Logo zu sehen.
Sehr subtil, aber beeindruckend, dass sie das umgesetzt haben.
Ich empfehle dieses Video über die Fotofinish-Kamera auf einer Pferderennbahn; ich glaube, andere könnten das auch interessant finden.
In dem Bild, in dem der Zug perfekt scharf zwischen den Farbstreifen stehen bleibt, steckt ein enormes Geschwindigkeitsgefühl.
Ich finde, das Denoising wirkt etwas unnatürlich und scheint die verbliebenen Artefakte, besonders die Farbsäume in den Details, eher noch stärker hervorzuheben.
Ich würde diese Funktion eher deaktivieren.
Und im Zusammenhang mit dem Demosaicing frage ich mich, ob sich mit dieser Version von RCD eine hochauflösende Ausgabe ohne Artefakte erreichen ließe.
Auch die Korrektur vertikaler Streifen funktioniert nicht in allen Fällen gut und erzeugt manchmal sogar noch mehr Muster.
Es gibt noch viel zu tun.
RCD-Demosaicing ist der nächste Schritt; das Problem mit den Farbsäumen kommt daher, dass ich für die roten und blauen Kanäle einfache lineare Interpolation verwendet habe.
Da der grüne Kanal das gesamte Bild abdeckt, überlege ich, wie man ihn als Leitkanal für eine bessere Interpolation nutzen könnte.