Mikroskopie: Massstab automatisch einfügen | archaeometallurgie.de

Mikroskopie: Maßstab automatisch einfügen

Bastian Asmus

EPIPOL16QRWer 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:

  1. Ein RFID Chip am Objektiv und eine Lesespule am Mikroskop -> Klingt toll, ist aber zu umständlich
  2. 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?
  3. Überwache nicht das Mikroskop, sondern die Aufbewahrung der Mikroskopobjektive -> Gute Idee, funktioniert aber nur bei Mikroskopen mit Einzelobjektivaufnahme
  4. 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.

terminal

Öffne das Terminal und teste ob die Kamera unter Linux ansprechbar ist.

 

livefeed

zbarcam ist eine kleine, feine Software, die es erlaubt Qr Codes zu dekodieren. Wir verwenden es für die automatiasche Objektiverkennung am Mikroskop.

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 (;


Leave a Reply