Mikroskopie: Maßstab automatisch einfügen
Wer kennt das nicht: Man hat jede Menge Mikrofotos geschossen und stellt später fest, dass man bei einigen Bildern die Maßstabsangabe vergessen hat! Das ist natürlich bei genau den Fotos passiert, die man sich für einen Vortrag oder eine Publikation ausgesucht hat. Ich träume schon lange von einem automatisierten System das solche Fehler verhindert, ganz so wie es bei den neueren Mikroskopen der Fall ist. Für ältere Mikroskope funktioniert das aber nicht, da die Kamera nicht mit dem Mikroskop kommuniziert. Dies, oder man hat sich eine eigene Kameraadaption hergestellt und möchte weiter mit seinem Remote Capture Programm arbeiten, an das man sich schon gewöhnt hat.
Der Artikel beschreibt zuerst welche Dinge man benötigt, welche Informationen auf welche Weise weiter gegeben werden müssen, und stellt dann ein kleines Skript vor, dass die Aufgabe übernimmt, diese Daten in die Metadaten des gerade aufgenommen Bildes zu schreiben. Die so gewonnen Bilder können mit diesem Skript, das hier vorgestellt wird einen Massstab automatisch einfügen.
Automatische Objektiverkennung
Es gilt zunächst ein System zu finden, dass es uns erlaubt das verwendete Objektiv zu erkennen. Mit dieser Information ermitteln wir die abgebildete Breite der Mikrographie. Auch das ist im oben genannten Artikel bereits beschrieben.
Im Artikel über QR Codes und Metadaten haben wir gesehen, wie man während des Photographierens Metadaten in Photos schreibt. Diesen Lösungsansatz verwenden wir hier auch, gestalten das Skript aber ein wenig robuster, so dass das wir sicher sein können, dass das Skript keine fehlerhaften Daten in die Photos schreibt! Folgende Lösungen bieten sich an, die Objektiverkennung umzusetzen:
- Ein RFID Chip am Objektiv und eine Lesespule am Mikroskop -> Klingt toll, ist aber zu umständlich
- Computer Vision, z.B. opencv um die Objektivbeschriftung zu lesen-> zu hoher Programmieraufwand; was passiert wenn das Objektive seine Beschriftung auf der von der Kamera abgewandten Seite hat?
- Überwache nicht das Mikroskop, sondern die Aufbewahrung der Mikroskopobjektive -> Gute Idee, funktioniert aber nur bei Mikroskopen mit Einzelobjektivaufnahme
- Minikamera zum Lesen eines angebrachten QR Codes -> so machen wir das
Punkt 4 ist der viel verprechendste Ansatz. Ich habe mittels eines rückstandsfrei ablösbaren doppelseitigem Klebeband einen kleinen QR Code Aufkleber am Objektiv angebracht. Als Minikamera verwende ich ein kleines USB Endoskop, eine Software wie zbar dekodiert den QR Code und einige Zeilen Bash Skript tragen dafür Sorge, dass alle Metadaten in das Bild geschrieben werden. Unter Linux ist es zunächst notwendig die Kamera anzusprechen. Also stecken wir die Kamera ein und starten das Terminal. Folgender Befehl listet den Ort auf, unter dem die Kamera gefunden wird:
ls /dev/video*
Es sollte etwa folgendes ausgeben:
/dev/video0
Da wir nun wissen, wo die Kamera ist, können wir ein wenig mit QR Codes oder anderen Barcodes spielen. Dazu nutzen wir das Programm Zbarcam, der zbar Software.
zbarcam /dev/video0
Dies öffnet ein Fenster mit einem live Bild des USB Endoskops. Wenn wir damit einen QR Code filmen, erscheint ein grüner Rahmen um den Code, wenn dieser dekodiert ist. Das Terminal gibt den dekodierten Wert des Codes zurück. Dies funktioniert im übrigen auch mit anderen, wenngleich nicht mit allen Barcodes.
Falls ihr auch fragt, welche USB-Kamera ich verwendet habe: Ich verwende die preiswerten USB Endoskop Kameras die bei einem großen Online-Auktionshaus für um die 12 Euro verkauft werden. Die Kameras funktionieren gut mit Linux, die beigelegte Treiber CD habe ich mir gar nicht erst ansehen müssen. Die Kamera wird in einer kleinen Metallschachtel samt CD ausgeliefert. Die Auflösung ist mit 640 x 400 Pixel gering reicht aber für unsere Anwendung mehr als aus.
Nun, da die Kamera erkannt ist und das Dekodieren der QR Codes funktioniert, haben wir einen kleinen Schritt, aber wesentlichen Schritt zur eigenen automatischen Objektiverkennung getan. Ich habe der Einfachheit halber meine Objektive durch nummeriert: Mein Epiplan POL 4x hat die Nummer 1, das Epiplan POL 8x die Nummer 2, usw.
Als kleine Gedächtnisstütze: So stellt man einen QR Code im Terminal her:
qrencode -o 1.png "1"
Die Datei mit dem QR Code heisst 1.png und hat den Wert 1. Das Ganze ausdrucken, ausschneiden und aufkleben.
Nachdem wir auf jedes Objektiv einen individuellen QR Code angebracht haben, können wir mit dem Skript fortfahren.
Das Skript
Das Skript ist wirklich einfach, auch wenn es auf Anhieb vielleicht nicht so aussieht. YAD wird für die graphische Benutzeroberfläche genutzt, tragt Sorge dafür, dass es installiert ist. Außerdem brauchen wir die Programme zbar, avconv and inotifywait, welche alle online verfügbar sind. In meinem anderen Artikel zum QR Code ist die Installation beschrieben.
#!/bin/bash #write_width_info.sh v0.3 # Automatic objective lens detection # Bastian Asmus 4. November 2014 # modified 10. November 2014 # Inotify waits fo the files to appear in the # file system and adds the image width info to # to the xmp-lr name space as hierarchical subject. # this can be read from digikam directly and is then # stored in "my keywords" # # Log file in ~/.microscopy/miclog... function clean_up { # Perform program exit housekeeping if [ -f /tmp/out.jpg ]; then rm /tmp/out.jpg fi echo "Stopped script at $(date +%T)" >> .microscopy/miclog$(date +%B%Y) exit } trap clean_up SIGINT clear echo "*********************** End script with CTRL C!" #currently the array $tags holds the dimension info. I am # working with four objective lenses, which have the unique IDs 1 to 4. # These IDs coincide with the position in the array. the entry Photomicrograph is # used by my own hierarchical data structure. If you remove it make sure to count # your objective lenses from zero. tags=(Photomicrograph 2.7mm 1.4mm 720µm 275µm) pa=`ls /dev/video*` if [ -z $pa ]; then yad --info --title="WEBCAM" --mouse --geometry=320x200 --text="You should connect the webcam first" --button="OK" exit 0 else echo "Webcamera is at $pa" fi #Log all the stuff in a hidden folder .microscopy/miclog in case you need # to debug mkdir -p ~/.microscopy || exit 1 if [ ! -f .microscopy/miclog$(date +%B%Y) ]; then echo "Logfile for microscopy images" > .microscopy/miclog$(date +%B%Y) #log all photos and associated info fi echo "Started script at $(date +%T)" >> .microscopy/miclog$(date +%B%Y) inotifywait -m -r /your/path/to/the7micropgraphy/directory/ -e create | while read path action file; do echo "The file '$file' appeared in directory '$path' via '$action'" if [[ $file = *.jpg ]] then scale="" while [ -z $scale ] do #streamer -f jpeg -o /tmp/image.jpeg & avconv -f video4linux2 -s 320x240 -i $pa -ss 0:0:2 -frames 1 /tmp/out.jpg & wait scale=`zbarimg --raw /tmp/out.jpg` timestamp=`date` #scale=`zbarimg --raw /tmp/image.jpeg` mv /tmp/out.jpg /tmp/out1.jpg done echo "$timestamp, objektive code: $scale, imgae width: ${tags[$scale]}, $file" >> .microscopy/miclog$(date +%B%Y) echo "This is the ID tag of the microscope lens: $scale. This is the image width: ${tags[$scale]}" exiftool -xmp-lr:HierarchicalSubject="${tags[0]}" -xmp-lr:HierarchicalSubject="${tags[0]}|${tags[$scale]}" -xmp-lr:HierarchicalSubject="${tags[0]}|${tags[$scale]}" $path$file echo "${tags[0]}/${tags[$scale]}" fi done
Das Skript übernimmt folgende Aufgaben:
- Prüft ob die Kamera eingesteckt ist
- sucht sich den richtigen Pfad zur Kamera
- legt eine Log Datei in einem versteckten Verzeichnis .microscopy/miclog[Datum] an
- nutzt avconv um Bilder aus dem Livefeed zu isolieren
- die Kamera ist immer nur kurz eingeschaltet ist, wenn ein Foto gemacht wird
- diese Standbilder werden zum Dekodieren genutzt
- nur die zwei letzten Bilder der QR Codes werden im /tmp/ Ordner des Systems gespeichert
- Drücke CTRL C um das Skript ordnungsgemäß zu beenden
Vielleicht noch als Hinweis: Zeile 34 definiert das Array mit den Abbildungsbreiten der Objektive. Ich habe vier Objektive, die 2,7mm, 1.4mm, 720µm und 275µm abbilden, diese haben die Nummern 1-4, welche der Position im Array entsprechen. Wenn Ihr etwas ändern wollt ,um es an eure Objektive anzupassen, denkt bitte daran!
Maßstab automatisch einfügen
Um den Maßstab automatisch einzufügen, kann das Skript aus diesem Artikel benutzt werden.
Ich bin dabei die Skripte noch etwas komfortabler zusammen zu fassen. Wenn es soweit ist, werde ich das hier vorstellen.
So, das wars mal fürs Erste. Bei Fragen, einfach fragen (;