3 Möglichkeiten einen Maßstab in eine Mikrophotographie einzufügen | archaeometallurgie.de

Mikrophotographie und der Maßstab

Bastian Asmus


Dieser Beitrag erläutert drei verschiedene Methoden, wie man einen Maßstab in eine Mikrophotographie einbaut, und zwar voll manuell, Programm gestützt, und voll automatisch mit einem Shell Skript. Es gibt grundsätzlich zwei verschiedene Möglichkeiten dem Betrachter die originale Größe des photographierten Ausschnitts mit zu teilen: Erstens als Bildunterschrift die uns die Breite des Ausschnitts mitteilt, und, zweitens einen Maßstab. Die linke Mikrophotographie (Klick!) zeigt die Lösung mit einer unaufdringlichen Leiste am unteren Bildrand, die rechte Mikrophotographie zeigt eine Lösung mit Maßstab.

din07chur01_000iso4_43din07chur01_000iso4_43

1. Manuelles Einfügen eines Maßstabs
2. Maßstab einfügen mit der wissenschaftlichen Bildverarbeitungssoftware ImageJ
3. Automatisches Einfügen mit Hilfe von Metadaten und Shell Skript

1. Manuelles Einfügen eines Maßstabes in die Mikrophotographie

Macht es Sinn sich die Vergrößerung zu notieren? Wenn es um die Größenangabe des des dargestellten Ausschnitts geht muss die Antwort NEIN lauten, denn die Vergrößerung bezieht sich auf das was wir im Okular sehen. Ein Mikrophoto kann aber in einer beliebigen Größe wiedergegeben werden. Deshalb wird ein Maßstab benötigt, der die reale Größe des photographierten Ausschnitts vermittelt:

  1. Stelle Mikrophotographien eines Objektmikrometers her. Wiederhole diesen Schritt für alle Deine Objektive. Notiere die abgebildete Ausschnittsbreite, speichere diese idealerweise direkt in den Metadaten des Bildes ab. Ein Mikrophoto wird mit gleichen Einstellungen und gleichen Objektiven immer gleich breit abgebildet.

    Bild eines Objektmikrometers

    Beispiel eines Objektmikrometers für die Auflichtmikroskopie.

  2. Berechne das Verhältnis Pixel/µm aus bekannter Länge im Mikrometern (µm) und der Breite in Pixeln. Dieses Verhältnis kann dazu benutzt werden eine beliebige Länge eines Maßstabs zu berechnen. Beispiel: Die Bildbreite der unten gezeigten Mikrophotographie beträgt 3245 Pixel. Sie bildet 620 µm  Länge des Objektmikrometers ab: 3245 pixels / 620 µm = 4,99 Pixel/µm

    Objektmikrometer Mikrophotographie

    Die Mikrophotographie bildet 620 µm des Objektmikrometers ab. Bildet man das Verhältnis aus Bildbreite in Pixeln abgebildeter Länge, kann man damit einen Maßstab beliebiger Länge (in Pixel) berechnen.

  3. Berechne die gewünschte Maßstabslänge in Pixlen. Nehmen wir an wir möchten einen Maßstab mit 200 µm Länge in die Mikrophotographie einfügen. Im Bildbearbeitungsprogramm müssen wir dann eine Linie von 200 µm * 4.99 Pixel/µm = 998 Pixel zeichnen..
  4. Zeichne den Maßstab. Nahezu jedes Graphikprogramm sollte das können. Ich nutze Inkscape. Zeichne eine Linie mit dem Bézier Werkzeug und füge den Text 200 µm hinzu. Mit dem align Werkzeug kann man Maßstab und Text zentrieren.

    Mit Inkscape den Maßstab für die Mikrophotographie zeichnen

    Zeichnen des Maßstabds für die Mikrophotographie: Achte in Inkscape darauf die Maßeinheit auf  Pixel (px) umzustellen. Zeichne mit dem Bézier Werkzeug (Tastaturbefehl: B) eine gerade Linie. Wechsle ins Auswahlwerkzeug (F1) und gib Länge und Dicke der Linie ein.

  5. Exportiere den Maßstab als PNG Graphik. Wähle alles aus (Strg + A), drücke den Export Button, wähle den Auswahl Button, überprüfe dass die Bitmapgröße auf die richtige Länge eingestellt ist. In unserem Fall 998 Pixel.

    Benutzung von Inkscape 2

    Wähle Auswahl. Setze die Bitmapgröße auf den berechneten Wert.

  6. Platziere den Maßstab in deiner Mikrophotographie mit GIMP oder einem anderen Bildbearbeitungsprogramm.

Natürlich kann man sich anstatt der Linie auch jeden anderen Maßstab im Zeichenprogramm herstellen und dann jeweils in die richtige Größe skalieren. Diese geschilderte Vorgehensweise empfiehlt sich nur dann wenn man ein oder zwei  Mikrophotographien mit einem Maßstab versehen möchte. Werden es mehr wird der Aufwand sehr schnell zu groß. Der Einsatz der Stapelverarbeitung wäre dann vorzuziehen…

2. Maßstab einfügen mit der wissenschaftlichen Bildverarbeitungssoftware ImageJ

Man kann das Programm ImageJ verwenden, um den Prozess des Einfügens eines Maßstabs in eine Mikrophotographie ein wenig zu beschleunigen. Es bleibt jedoch Handarbeit.

1. Gehe zu [set scale] im [Analyze] Menü

imagej Benutzung zum Einfügen eines Maßstabes in eine Mikrophotographie

 

2. Gib die Daten für bekannte Länge in Pixel und µm (mm,…) einAbmessungen des Maßstabs für die Mikrophotographie

3. Gehe zu [Scale Bar…] im [Tools] Untermenü des [Analyze] Menüs

Einsetzen des Maßstabs in die Mikrophotographie

4. Entscheide Dich für Länge, Farbe und Platzierung des Maßstabs. Fertig!

Festlegen des Aussehens des Maßstabs

3. Automatisches Einfügen mit Hilfe von Metadaten und Shell Skript

Danke der Hilfe mit regular expressions von Johannes Kutterer von archaeomatics.de habe ich mich endlich hingestzt und ein Skript geschrieben, dass die  Aufgabe des Einfügens des Maßstabes automatische erfüllt. Das Skript funktioniert nur dann wenn die Ausschnittsbreite in den Metadaten der Mikrophotographie hinterlegt wurden. Ich verwende hierfür die Schlüsselwörter, die sowohl in Exif, IPTC und XMP Metadaten eingegeben werden können. Ich verwende hierfür die äußerst praktische und ausgefeilte Software digiKam.

Screenshot von digiKam

digiKam bietet viele professionelle Werkzeuge, wird ständig weiter entwickelt, beruht auf freier Software, und ist hervorragend geeignet Metadaten zu editieren, auf deren Grundlage der Maßstab Skript-basiert in die Mikrophotographie eingefügt werden kann.

#!/bin/bash
# © Bastian Asmus 2013, v 0.1
# This simple script reads the meta information of a file,
# specifically the EXIF keywords, and extracts the section length-
# the section length is used to calculate the scalebar
# the scalebar is put into a small strip at the bootom of the image #!/bin/bash
# Bastian Asmus 2013
# This simple script reads the meta information of a a file, specifically the EXIF keywords, and extracts the section length-
# the section length is used to calculate the scalebar
# the scalebar is put into a sma llstrip at the bottom of the image 
#the new image is saved in a new folder called "annotated"
 
# Use a simple shell loop, to process each of the images.
# The first line creates a folder called annotated within the selected directory
#The for loop repeats the step until
# f is the variable for the filename

# whiptail is used for a simple menu structure

if (whiptail – title "Scale bars for micrographs" – backtitle "Press Esc to end script"  – yesno – yes-button yes – no-button no "Would you like to use the default scale bar colour scheme?"  10 40 )
then       
ext='JPG'
colour='white'
bgcolour='black'
inform="Dr. Bastian Asmus"
echo "Your selection: white scale bar on black background"
  else
INIT=JPG
ext=$(whiptail – inputbox "Specify the file extension (jpg, jpeg, png, tif,..)" – backtitle "Press Esc to end script" 8 78 $INIT – title "File extension" 3>&1 1>&2 2>&3)
 
exitstatus=$?
if [ $exitstatus = 0 ]; then
    echo "You selected "$ext" as file extension."
else
    echo "You stopped the script."
exit
fi
INIT=white
colour=$(whiptail – inputbox "Specify the scale bar colour. You may also use hex colour codes" – backtitle "Press Esc to end script" 8 78 $INIT – title "Colour" 3>&1 1>&2 2>&3)
 
exitstatus=$?
if [ $exitstatus = 0 ]; then
    echo "You selected "$colour" as scale bar."
else
    echo "You stopped the script."
exit
fi
INIT=black
bgcolour=$(whiptail – inputbox "Specify the background colour. You may also use hex colour codes" – backtitle "Press Esc to end script" 8 78 $INIT – title "Background colour" 3>&1 1>&2 2>&3)
 
exitstatus=$?
if [ $exitstatus = 0 ]; then
    echo "You selected "$bgcolour" as background colour."
else
    echo "You stopped the script."
exit
fi
INIT="Dr. B. Asmus"
inform=$(whiptail – inputbox "Here you may additional infromation" – backtitle "Press Esc to end script" 8 78 $INIT – title "Additional information" 3>&1 1>&2 2>&3)
 
exitstatus=$?
if [ $exitstatus = 0 ]; then
    echo "You added "$inform" as additional information to the strip at the bottom."
else
    echo "You stopped the script."
exit
fi
fi
#end of menu

if [ ! -d "annotated" ]; then        #check if the folder does exist
   mkdir annotated
fi

for f in *.$ext
do 
section=`exiftool -keywords ${f}|sed "s/.*[[:blank:]]\([0-9]\+[.]\?[0-9]\+\)[[:blank:]]\?[µ]\?[m].*/\1/" `
# use bc to calculate floats..

if ((`echo $section \> 70 | bc` & `echo $section \< 149 | bc`))
then
legende=25
unit='µm'
elif ((`echo $section  \> 150 | bc` & `echo $section  \< 499 | bc`))
then
legende=50
unit='µm'
elif ((`echo $section  \>= 500 | bc` & `echo $section  \< 999 | bc`))
then
legende=100
unit='µm'
elif ((`echo $section  \>= 1000 | bc` & `echo $section  \< 2000 | bc`))
then
legende=200
unit='µm'
elif ((`echo $section  \> 0.8 | bc` & `echo $section  \< 2.0 | bc`))
then
legende=`echo 0.2 | bc`
unit='mm'
elif ((`echo $section  \>= 2.0 | bc` & `echo $section  \< 4.0 | bc`))
then
legende=1
unit='mm'
elif ((`echo $section  \>= 4.0 | bc` & `echo $section  \< 6.0 | bc`))
then
legende=2
unit='mm'
fi
echo $section
width=`identify -format %w ${f}`    # %w is the width in pixels
height=`identify -format %h ${f}`     # %h is the height in pixels
bh=$(( ($height/24)))            # bh is the boxheight

# always use the longest side of the 
# micrograph for the calculation of the scalebar!

if (( $width > $height ))        # landscape
then
scalebar=$((`echo $width\*$legende\/$section\+$bh | bc`))
strokewidth=$((`echo $width\*$legende\/$section\/50 | bc`))
#strokewidth=$(( $width*$legende/$section/50 ))
textpox=$((`echo $width\*$legende\/$section\/2 | bc`))

elif (( $height > $width ))        # portrait
then
scalebar=$((`echo $height\*$legende\/$section\+$bh | bc`))
#strokewidth=$(( $width*$legende/$section/50 ))
strokewidth=$((`echo $width\*$legende\/$section\/50 | bc`))
textpox=$((`echo $height\*$legende\/$section\/2 | bc`))
fi

rh=$(( $height/40 ))            #rh is the pointsize
uy=$(( $height+$bh/4 ))            #uy: upper y position of the box
textpoy=$(( $height-(($bh-$rh)*8/10) ))

echo annotated ${f} and saved a copy to annotated/${f} 

convert ${f} -gravity South -background ${bgcolour} -splice 0x${bh} -stroke ${colour} \
-strokewidth ${strokewidth} -draw "line ${bh},${uy},${scalebar},${uy}" \
-gravity SouthWest -pointsize ${rh} -fill ${colour} -strokewidth 0  -draw "translate   $textpox,0 text 0,0 '${legende} ${unit}'" \
-gravity SouthEast -pointsize ${rh} -fill ${colour} -strokewidth 0  -draw "translate   ${bh},0 text 0,0 '${inform} - Labor für Archäometallurgie'" annotated/${f}


done
echo Done!
# the new image is saved in a new folder called "annotated"

# Use of a simple shell loop, to process each image of the images.
# The first line creates a folder called annotated within the selected directory
# The for loop repeats the step until
# f is the variable for the filename

# whiptail is used for a simple menu structure

if (whiptail – title "Scale bars for micrographs" – backtitle "Press Esc to end script"  – yesno – yes-button yes – no-button no "Would you like to use the default scale bar colour scheme?"  10 40 )
then       
ext='JPG'
colour='white'
bgcolour='black'
inform="Labor für Archäometallurgie"
echo "Your selection: white scale bar on black background"
  else
INIT=JPG
ext=$(whiptail – inputbox "Specify the file extension (jpg, jpeg, png, tif,..)" – backtitle "Press Esc to end script" 8 78 $INIT – title "File extension" 3>&1 1>&2 2>&3)

exitstatus=$?
if [ $exitstatus = 0 ]; then
    echo "You selected "$ext" as file extension."
else
    echo "You stopped the script."
exit
fi
INIT=white
colour=$(whiptail – inputbox "Specify the scale bar colour. You may also use hex colour codes" – backtitle "Press Esc to end script" 8 78 $INIT – title "Colour" 3>&1 1>&2 2>&3)

exitstatus=$?
if [ $exitstatus = 0 ]; then
    echo "You selected "$colour" as scale bar."
else
    echo "You stopped the script."
exit
fi
INIT=black
bgcolour=$(whiptail – inputbox "Specify the background colour. You may also use hex colour codes" – backtitle "Press Esc to end script" 8 78 $INIT – title "Background colour" 3>&1 1>&2 2>&3)

exitstatus=$?
if [ $exitstatus = 0 ]; then
    echo "You selected "$bgcolour" as background colour."
else
    echo "You stopped the script."
exit
fi
INIT=""
inform=$(whiptail – inputbox "Here you may additional infromation" – backtitle "Press Esc to end script" 8 78 $INIT – title "Additional information" 3>&1 1>&2 2>&3)

exitstatus=$?
if [ $exitstatus = 0 ]; then
    echo "You added "$inform" as additional information to the strip at the bottom."
else
    echo "You stopped the script."
exit
fi
fi
#end of menu

if [ ! -d "annotated" ]; then		#check if the folder does exist
   mkdir annotated
fi

for f in *.$ext
do 
section=`exiftool -keywords ${f}|sed "s/.*[[:blank:]]\([0-9]\+[.]\?[0-9]\+\)[[:blank:]]\?[µ]\?[m].*/\1/" `
# use bc to calculate floats..
if ((`echo $section \> 700 | bc` & `echo $section \< 1490 | bc`))
then
legende=25
unit='µm'
elif ((`echo $section  \> 150 | bc` & `echo $section  \< 499 | bc`))
then
legende=50
unit='µm'
elif ((`echo $section  \> 500 | bc` & `echo $section  \< 999 | bc`))
then
legende=100
unit='µm'
elif ((`echo $section  \> 1000 | bc` & `echo $section  \< 2000 | bc`))
then
legende=200
unit='µm'
elif ((`echo $section  \> 0.8 | bc` & `echo $section  \< 2.0 | bc`))
then
legende=`echo 0.2 | bc`
unit='mm'
elif ((`echo $section  \> 2.0 | bc` & `echo $section  \< 4.0 | bc`))
then
legende=1
unit='mm'
elif ((`echo $section  \> 4.0 | bc` & `echo $section  \< 6.0 | bc`))
then
legende=2
unit='mm'
fi

width=`identify -format %w ${f}`	# %w is the width in pixels
height=`identify -format %h ${f}` 	# %h is the height in pixels
bh=$(( ($height/24)))			# bh is the boxheight

# always use the longest side of the 
# micrograph for the calculation of the scalebar!

if (( $width > $height ))		# landscape
then
scalebar=$((`echo $width\*$legende\/$section\+$bh | bc`))
strokewidth=$((`echo $width\*$legende\/$section\/50 | bc`))
#strokewidth=$(( $width*$legende/$section/50 ))
textpox=$((`echo $width\*$legende\/$section\/2 | bc`))

elif (( $height > $width ))		# portrait
then
scalebar=$((`echo $height\*$legende\/$section\+$bh | bc`))
#strokewidth=$(( $width*$legende/$section/50 ))
strokewidth=$((`echo $width\*$legende\/$section\/50 | bc`))
textpox=$((`echo $height\*$legende\/$section\/2 | bc`))
fi

rh=$(( $height/40 ))			#rh is the pointsize
uy=$(( $height+$bh/4 ))			#uy: upper y position of the box
textpoy=$(( $height-(($bh-$rh)*8/10) ))

echo annotated ${f} and saved a copy to annotated/${f} 

convert ${f} -gravity South -background ${bgcolour} -splice 0x${bh} -stroke ${colour} \
-strokewidth ${strokewidth} -draw "line ${bh},${uy},${scalebar},${uy}" \
-gravity SouthWest -pointsize ${rh} -fill ${colour} -strokewidth 0  -draw "translate   $textpox,0 text 0,0 '${legende} ${unit}'" \
-gravity SouthEast -pointsize ${rh} -fill ${colour} -strokewidth 0  -draw "translate   ${bh},0 text 0,0 '${inform}'" annotated/${f}
done
echo Done!

 

Gut, aber wie verwendet man das Skript eigentlich?

  1. Es ist ein Bash Skript das von der Shell aus aufgerufen wird
  2. navigiere in deine Bildverzeichnis
  3. das Skript nutzt defaultmäßig einen weißen Maßstab auf schwarzem Hintergrund und arbeitet mit JPGs.Benutzung des scalebar Skripts zum Automatischen Einfügen des Maßstabs in die MikrophotographieBenutzung des scalebar Skripts zum Automatischen Einfügen des Maßstabs in die Mikrophotographie
  4. Farben und Bildformate können geändert werden
    Benutzung des scalebar Skripts zum Automatischen Einfügen des Maßstabs in die MikrophotographieBenutzung des scalebar Skripts zum Automatischen Einfügen des Maßstabs in die Mikrophotographie
  5. das Skript legt ein neues Unterverzeichnis an und legt dort Kopien mit Maßstab ab
  6. Fertig

    din03fil01_020iso12_14

    Mikrophotographie mit gekreuzten Polarisator und Analysator. Der Maßstab und der Text wurden mit obigem Shell Skript erzeugt.

Gut, und wie funktioniert das Skript?

Das Skript wertet die Schlüsselwörter im der Mikrophotographie aus. Es berechnet aus der hinterlegten Information der Ausschnittsbreite (µm) und der Breite des Bildes in Pixeln die Länge das Maßstabs und fügt diesem in einem Streifen unter das Bild ein. Das Skript lässt sich leicht in jede weitere Richtung verändern: Etwa Einfügen anderer Information, wie die des Kontrastverfahrens, Copyright Informationen usw,…

Das Skript benötigt die Imagemagick und Exiftool.


One Response to “Mikrophotographie und der Maßstab”

  • Mikroskopie: Massstab automatisch einfügen | archaeometallurgie.de Says:

    […] 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. Dann kann man die so gewonnen Bilder mit diesem Skript, das hier vorgestellt wird eine Massstab automatisch einfügen. […]

Leave a Reply