- 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
Noch keine Kommentare.