Zuverlässige Bemaßung bei variablem Kamerazoom

Begonnen von Ralf, Dezember 02, 2008, 20:32:46 NACHMITTAGS

Vorheriges Thema - Nächstes Thema

Ralf

Hallo,

schon öfter habe ich im Forum gelesen, dass es keinen Sinn mache das Objektmikrometer mit der Canon G9 oder anderen Kompaktkameras zu fotografieren, weil der Zoom an der Kamera nicht reproduzierbar einstellbar sei. Somit sei dann eine spätere Verwendung des Masstabsfotos in anderen Aufnahmen wegen des unbekannten Zooms nicht möglich.
Zur Lösung dieses Problems möchte ich hier meine Vorgehensweise mit der Canon G9 vorstellen:

Zuerst wird das Objektmikrometer bei gegebenem Mikroskopobjektiv und gegebener Kameraauflösung (Megapixel) in möglichst vielen Zoomstellungen der Kamera fotografiert. Dies führt man für alle Objektive durch. Dann erstellt man eine Tabelle mit folgenden Spalten:

1) Vergrößerung des Mikroskopobjektivs, also z.B. 5 oder 10 oder 63
2) Brennweite der Kamera. Aus der EXCIF Information der Datei zu lesen, oder auch aus dem "ZoombrowserEX" bei Canon Kameras
3) Produkt aus Brennweite und Objektivvergrößerung. Also Spalte 1 * Spalte 2
4) Pixel pro 20 µm (aus dem Foto des Objektmikrometers zu ermitteln). Man kann selbstverständlich auch "Pixel pro 50 µm" oder einen beliebigen anderen Wert ermitteln.

Spalte 3 und Spalte 4 ergeben einen linearen Zusammenhang. Jede Tabellenkalkulation (OpenOffice oder auch Excel) rechnet das im Handumdrehen aus und zeicnet auch die Gerade. Bei mir gehorcht das System der Geradengleichung y= 0,2x +0,4. Mit x = Produkt aus Brennweite und Objektivvergrößerung und y = Pixel pro 20 µm. Eigentlich sollte die Gerade durch Null gehen. Der Achsenabschnitt von nur 0,4 Pixeln liegt aber unter der Messgenauigkeit (ein Pixel) und damit kann ich gut leben.

Selbst wenn künftig ein noch nicht vermessener Kamerazoom auftreten sollte, kann man anhand der Geradengleichung den Masstab leicht errechnen. So habe ich bei meinem 10x Objektiv vergessen, die Brennweite 29,2mm zu vermessen. Dies nachzuholen, ist jetzt nicht mehr notwendig, der Wert kann berechnet werden.


Hier zur Illustration meine Tabelle und mein Graph:

ObjektivBrennweiteO*BWPixel/20µmgemessenberechnet
5251252525,4
529,21462929,6
536,818437,437,2
544,422244,744,8
102525049,250,4
1029,229258,8
1036,836871,974
1044,444487,389,2
202550099100,4
2029,2584114,3117,2
2036,8736143,1147,6
2044,4888173178
40251000197,4200,4
4029,21168238,1234
4036,81472290294,8
4044,41776309,5315,4
6329,21839,6363368,32
6336,82318,4455,2464,08
6344,42797,2550,1559,84

Vielen Dank an Rolf-Dieter Müller, der mir die Tabelle schließlich so perfekt formatiert hat  :).




Günter

Hallo in die Runde,

der aufgezeigte geniale Weg von Ralf hat mich inspiriert, die erforderlichen Schritte zur Ermittlung der Pixel für den Maßstabsbalken zu automatisieren.
Ich bin ein Linux-Freund der Kommandozeile hier mein Konzept. Windows-user können die Strategie entsprechend anpassen.

Zielsetzung:
einfacher script-Aufruf liefert als Ergebnis die "Pixel pro 20µ", die man dann sofort für den Maßstabsbalken in ImageJ eingeben kann.

der Weg:
jhead ist ein kleines Kommandozeilenprogramm zur Ausgabe (und Modifikation) der exif-Daten. (http://www.sentex.net/~mwandel/jhead/) (siehe
      exif Daten auslesen - ein nettes Werkzeug gefunden     )

In einem script greife ich mir die "Focal length" heraus und rechne dann gleich - im Beispiel mit obiger Geradengleichung - die "Pixelanzahl pro 20µ" aus.

zB:             script namens 'pixel'
Aufruf:         pixel mikrofoto.jpg

liefert

Focal Length    : 7.7
Geradengleichung: y = $A + $B * OBJ * $FOCL
                : y = 0.4 + 0.2 * OBJ * 7.7
Objektiv =   5   - Pixel pro 20 µm : 15.2
Objektiv =  10   - Pixel pro 20 µm : 30.2
Objektiv =  40   - Pixel pro 20 µm : 120.2
Objektiv = 100   - Pixel pro 20 µm : 300.2


Hier habe ich mal angenommen, daß die eine Geradengleichung für alle Objektive gilt. Falls nicht, müssen entsprechende Umrechnungsfaktoren eingebaut werden. Rundungsfehler in der Ergebnisausgabe habe ich akzeptiert.

Für Interessierte hier noch das script (individuelle Anpassung der Parameter ist natürlich erforderlich)

#!/bin/bash

# $1 jpeg-Datei

A="0.4"
B="0.2"
FOCL=$(jhead $1 | fgrep "Focal" | awk '{ print $4}'| sed 's/mm//')

echo
echo "Focal Length    : $FOCL"
echo 'Geradengleichung: y = $A + $B * OBJ * $FOCL'
echo "                : y = $A + $B * OBJ * $FOCL"

for obj in 5 10 40 100
do
  Y=$(echo "$A*$FOCL*$obj+$B" | bc)
  echo "Objektiv = $obj   - Pixel pro 20 µm : $Y"
done


Wars verständlich was ich zeigen wollte ?

viele Grüße
Günter

@Ralf: falls mein Beitrag an dieser Stelle Dir unpassend erscheint, genügt ein kleiner Hinweis


über mich   
Folge denen, die die Wahrheit suchen.
zweifle an denen, die sie gefunden haben.

H. Ott

Hallo,

ich benutze eine CANON A95 und eine A640. Zusammen mit dem 'kleinen' ZEISS-Adapter wird das Bildfeld fast (A95) oder ganz (A640) in der max. optischen Telestellung ausgeleuchtet. Zumindest  mit der CANON Remote-Software geht die Brennweiteneinstellung meines Erachtens nicht kontinuierlich, sondern in kleinen Schritten. Die Endstellung ist rel. leicht einzustellen (weil der Beginn des 'digialen Zooms' angezeigt wird) und bleibt auch nach mehrmaligem Einstellen und Nachmessen mit dem Objektmikrometer ausreichend konstant. Festzustellen durch einfache Überlagerung der Aufnahmen mit dem Objektmikrometer. 'Ausreichend konstant' jedenfalls für das Ausmessen biologischer Objekte, das ohnehin immer mit gewissen Fehlern behaftet ist ('wo ist die Grenze der zu messenden Struktur', etc.). Für andere Zwecke mag dies anders zu beurteilen sein.

Wer andere Stellungen des Zooms benutzt oder benutzen muss, findet natürlich in der vorgeschlagenen Regressionslösung eine einfache und elegante Methode unter der Voraussetzung, dass die Brennweitenangaben in den exif-Daten stimmen. Was ich nicht bezweifle.


Mikrogrüße

H. Ott

Ralf

Zitat von: Günter in Januar 20, 2009, 20:24:30 NACHMITTAGS

@Ralf: falls mein Beitrag an dieser Stelle Dir unpassend erscheint, genügt ein kleiner Hinweis


Hallo Günter,

ganz im Gegenteil. Ich sehe Deinen Beitrag als schöne Ergänzung. Ich nutze zwar derzeit kein Linux mehr, aber das kann sich vielleicht noch mal ändern.