Mikrophotographie und der Maßstab
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.
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:
- 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.
- 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
- 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..
- 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.
- 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.
- 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ü
2. Gib die Daten für bekannte Länge in Pixel und µm (mm,…) ein
3. Gehe zu [Scale Bar…] im [Tools] Untermenü des [Analyze] Menüs
4. Entscheide Dich für Länge, Farbe und Platzierung des Maßstabs. Fertig!
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.
#!/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?
- Es ist ein Bash Skript das von der Shell aus aufgerufen wird
- navigiere in deine Bildverzeichnis
- das Skript nutzt defaultmäßig einen weißen Maßstab auf schwarzem Hintergrund und arbeitet mit JPGs.
- Farben und Bildformate können geändert werden
- das Skript legt ein neues Unterverzeichnis an und legt dort Kopien mit Maßstab ab
- Fertig
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.
Januar 9th, 2015 at 16:37
[…] 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. […]