photometric_stereoT_photometric_stereoPhotometricStereoPhotometricStereo (Operator)

Name

photometric_stereoT_photometric_stereoPhotometricStereoPhotometricStereo — Rekonstruieren einer Oberfläche mittels photometrischer Stereomessung.

Signatur

photometric_stereo(Images : HeightField, Gradient, Albedo : Slants, Tilts, ResultType, ReconstructionMethod, GenParamName, GenParamValue : )

Herror T_photometric_stereo(const Hobject Images, Hobject* HeightField, Hobject* Gradient, Hobject* Albedo, const Htuple Slants, const Htuple Tilts, const Htuple ResultType, const Htuple ReconstructionMethod, const Htuple GenParamName, const Htuple GenParamValue)

void PhotometricStereo(const HObject& Images, HObject* HeightField, HObject* Gradient, HObject* Albedo, const HTuple& Slants, const HTuple& Tilts, const HTuple& ResultType, const HTuple& ReconstructionMethod, const HTuple& GenParamName, const HTuple& GenParamValue)

HImage HImage::PhotometricStereo(HImage* Gradient, HImage* Albedo, const HTuple& Slants, const HTuple& Tilts, const HTuple& ResultType, const HString& ReconstructionMethod, const HTuple& GenParamName, const HTuple& GenParamValue) const

HImage HImage::PhotometricStereo(HImage* Gradient, HImage* Albedo, const HTuple& Slants, const HTuple& Tilts, const HTuple& ResultType, const char* ReconstructionMethod, const HTuple& GenParamName, const HTuple& GenParamValue) const

HImage HImage::PhotometricStereo(HImage* Gradient, HImage* Albedo, const HTuple& Slants, const HTuple& Tilts, const HTuple& ResultType, const wchar_t* ReconstructionMethod, const HTuple& GenParamName, const HTuple& GenParamValue) const   (Nur Windows)

static void HOperatorSet.PhotometricStereo(HObject images, out HObject heightField, out HObject gradient, out HObject albedo, HTuple slants, HTuple tilts, HTuple resultType, HTuple reconstructionMethod, HTuple genParamName, HTuple genParamValue)

HImage HImage.PhotometricStereo(out HImage gradient, out HImage albedo, HTuple slants, HTuple tilts, HTuple resultType, string reconstructionMethod, HTuple genParamName, HTuple genParamValue)

Beschreibung

photometric_stereophotometric_stereoPhotometricStereoPhotometricStereoPhotometricStereo kann dazu genutzt werden, die dreidimensionale Form eines Objekts von seiner zweidimensionalen Textur zu trennen, z.B. von seinem Druckbild. Der Operator benötigt mindestens drei Bilder des gleichen Objekts, aufgenommen mit unterschiedlichen bekannten Beleuchtungsrichtungen. Die Ausrichtung der Kamera zum Objekt muss für alle Bilder gleich sein.

Die dreidimensionale Form des Objekts wird in erster Linie in Form von lokalen Gradienten der dreidimensionalen Oberfläche berechnet. Diese Gradienten können weiter integriert werden, so dass ein Höhenmodell entsteht, d.h., ein Bild, in dem jeder Pixelwert einer relativen Höhe entspricht. Die zweidimensionale Textur wird als Albedo bezeichnet und entspricht der lokalen Lichtabsorption und Reflektionscharakteristik der Oberfläche ohne Einfluss von Schatten.

Typische Anwendungen des photometrischen Stereoverfahrens

Typische Anwendungen des photometrischen Stereoverfahrens sind das Erkennen kleiner Inkonsistenzen in einer Oberfläche, z.B. Defekten, oder das Ausschließen des Einflusses der Beleuchtungsrichtung auf Bilder, die z.B. für die Druckbildinspektion von nicht flachen Zeichen genutzt werden. Photometrisches Stereo ist nicht geeignet für die Rekonstruktion absoluter Höhen, d.h., es ist keine Alternative zu typischen 3D Rekonstruktionsansätzen wie Depth from Focus oder das Lichtschnittverfahren.

Einschränkungen des photometrischen Stereoverfahrens

photometric_stereophotometric_stereoPhotometricStereoPhotometricStereoPhotometricStereo basiert auf dem Algorithmus von Woodham und setzt daher zum einen eine orthoskopische Projektion der Kamera voraus, d.h., es muss eine telezentrische Linse oder eine Linse mit einer großen Brennweite benutzt werden. Zum anderen wird vorausgesetzt, dass jede der Lichtquellen parallele und gleichförmige Lichtstrahlen produziert, d.h., es müssen telezentrische Lichtquellen mit gleichförmiger Intensität oder, als Alternative, sehr weit entfernte Lichtquellen benutzt werden. Zusätzlich muss das Objekt Lambertsche Oberflächeneigenschaften aufweisen, d.h., es muss hereinkommendes Licht diffus reflektieren. Objekte oder Regionen eines Objekts, die spiegelnde Reflektionseigenschaften aufweisen (spiegelnde oder glänzende Oberflächen) können nicht korrekt verarbeitet werden und führen daher zu fehlerhaften Ergebnissen.

Der Aufbau

Die Kamera mit der telezentrischen Linse wird orthogonal, d.h., rechtwinklig, zu der zu konstruierenden Szene angebracht. Die Orientierung der Kamera in Bezug auf die Szene darf sich während der Bildaufnahme nicht verändern. Im Gegensatz dazu muss sich die Orientierung der Lichtquelle in Bezug auf die Kamera in mindestens drei Bildern ändern.

Spezifizieren der Beleuchtungsrichtungen

Für jedes Bild werden die Beleuchtungsrichtungen in Form von Winkeln innerhalb der Parameter SlantsSlantsSlantsSlantsslants und TiltsTiltsTiltsTiltstilts angegeben. Diese beschreiben die Richtung der Beleuchtung in Bezug auf die Szene. Zum besseren Verständnis dieser Parameter ist zu bedenken, dass der Ansatz davon ausgeht, dass die Lichtquelle parallele Lichtstrahlen erzeugt, die Kamera eine telezentrische Linse hat und die Kamera orthogonal zu der zu konstruierenden Szene angeordnet ist:

SlantsSlantsSlantsSlantsslants
Der Neigewinkel (SlantsSlantsSlantsSlantsslants) ist der Winkel zwischen der optischen Achse der Kamera und der Beleuchtungsrichtung.
image/svg+xml Slant
Seitenansicht
TiltsTiltsTiltsTiltstilts
Der Winkel in TiltsTiltsTiltsTiltstilts wird innerhalb der Objektebene oder einer beliebigen parallelen Ebene, z.B. der Bildebene, gemessen. Insbesondere beschreibt er den Winkel zwischen der Richtung, die von der Mitte des Bildes nach rechts zeigt, und der in das Bild projizierten Beleuchtungsrichtung. D.h., beim Blick auf das Bild (oder die korrespondierende Szene), entspricht eine Beleuchtung von rechts einem Winkel von 0°, eine Beleuchtung von oben einem Winkel von 90°, eine Beleuchtung von links einem Winkel von 180°, usw.
image/svg+xml 90° 180° 270° Tilt
Draufsicht

Wie oben erwähnt benötigt das photometrische Stereoverfahren mindestens drei Bilder mit verschiedenen Beleuchtungsrichtungen. Allerdings führt die dreidimensionale Geometrie der Objekte typischerweise zu einem Schattenwurf. In den Schattenregionen ist die Anzahl der effektiv verfügbaren Beleuchtungsrichtungen reduziert, so dass Mehrdeutigkeiten entstehen. Um trotzdem ein robustes Ergebnis zu erhalten, ist Redundanz nötig. Deshalb sollten normalerweise mehr als drei Lichtquellen mit unterschiedlichen Beleuchtungsrichtungen gewählt werden. Eine steigende Anzahl von Beleuchtungsrichtungen führt aber auch zu einer höheren Anzahl von zu verarbeitenden Bildern und somit zu einer höheren Verarbeitungszeit. In den meisten Anwendungen ist eine Anzahl von vier bis sechs Beleuchtungsrichtungen sinnvoll. Als Faustregel sollten die Winkel in SlantsSlantsSlantsSlantsslants zwischen 30° und 60° betragen. Die Winkel in TiltsTiltsTiltsTiltstilts sollten gleichmäßig rund um das zu vermessende Objekt angeordnet sein. Es ist zu beachten, dass die Beleuchtungsrichtungen so gewählt werden müssen, dass sie nicht in der gleichen Ebene liegen, d.h., sie müssen unabhängig sein. Ist dies nicht der Fall, wird eine Exception-Behandlung durchgeführt.

Eingabebilder und Domänen

Die Eingabebilder müssen als Bildarray in dem Parameter ImagesImagesImagesImagesimages übergeben werden. Jedes Bild muss dabei, wie bereits erwähnt, mit unterschiedlichen Beleuchtungsrichtungen aufgenommen worden sein. Liegen die Bilder in einem Mehrkanalbild vor, können sie mit Hilfe von image_to_channelsimage_to_channelsImageToChannelsImageToChannelsImageToChannels in einen Bildarray konvertiert werden. Alternativ kann ein Bildarray mittels concat_objconcat_objConcatObjConcatObjConcatObj erzeugt werden.

photometric_stereophotometric_stereoPhotometricStereoPhotometricStereoPhotometricStereo stützt sich auf die Auswertung "photometrischer Information", d.h., den Grauwerten, die in den Bildern gespeichert sind. Diese Information sollte möglichst unverzerrt und genau sein. Es sollte daher sicher gestellt sein, dass die für die Bildaufnahme verwendete Kamera eine lineare Charakterisitk aufweist. Mit dem Operator radiometric_self_calibrationradiometric_self_calibrationRadiometricSelfCalibrationRadiometricSelfCalibrationRadiometricSelfCalibration kann die Charakteristik der Kamera bestimmt werden und mit lut_translut_transLutTransLutTransLutTrans können die Grauwerte im Falle einer nicht-linearen Charakteristik korrigiert werden. Wenn genaue Messungen benötigt werden, sollte außerdem der volle Dynamikumfang der Kamera genutzt werden, da hierdurch genauere Grauwertinformationen erzielt werden. Aus dem selben Grund führen Bilder mit einer Bit-Tiefe von mehr als 8 (z.B. uint2 Bilder statt Byte Bilder) zu einer besseren Genauigkeit.

Die gewählte Domäne der Eingabebilder legt fest, welcher Algorithmus intern zur Verarbeitung der Bilder benutzt wird. Es stehen drei verschiedene Algorithmen zur Verfügung:

Die Ausgabebilder

Der Operator kann Bilder für die rekonstruierten Gradienten (GradientGradientGradientGradientgradient), den Albedo (AlbedoAlbedoAlbedoAlbedoalbedo) und das Höhenmodell (HeightFieldHeightFieldHeightFieldHeightFieldheightField) der Oberfläche zurückgeben:

Im Standardfall werden alle diese ikonischen Objekte zurückgeliefert, d.h., der Parameter ResultTypeResultTypeResultTypeResultTyperesultType ist auf 'all'"all""all""all""all" gesetzt. Falls nur bestimmte Ausgabebilder benötigt werden, kann ResultTypeResultTypeResultTypeResultTyperesultType auf ein Tupel gesetzt werden, das festlegt, welche der Ausgabebilder benötigt werden. Zur Auswahl stehen die Werte 'gradient'"gradient""gradient""gradient""gradient", 'albedo'"albedo""albedo""albedo""albedo" und 'height_field'"height_field""height_field""height_field""height_field". In bestimmten Anwendungen, z.B. zur Oberflächeninspektion, werden nur die Bilder für GradientGradientGradientGradientgradient und AlbedoAlbedoAlbedoAlbedoalbedo benötigt. Dann kann das Ausschließen der Oberflächenrekonstruktion die Verarbeitungszeit deutlich beschleunigen, d.h., hier würden für ResultTypeResultTypeResultTypeResultTyperesultType nur die Werte 'gradient'"gradient""gradient""gradient""gradient" und 'albedo'"albedo""albedo""albedo""albedo", aber nicht 'height_field'"height_field""height_field""height_field""height_field", übergeben werden.

Intern ermittelt photometric_stereophotometric_stereoPhotometricStereoPhotometricStereoPhotometricStereo zunächst die Gradienten und, falls benötigt, integriert diese Werte dann, um ein Höhenmodell zu erhalten. Diese Integration wird mit den gleichen Algorithmen ausgeführt, die für den Operator reconstruct_height_field_from_gradientreconstruct_height_field_from_gradientReconstructHeightFieldFromGradientReconstructHeightFieldFromGradientReconstructHeightFieldFromGradient zur Verfügung stehen und mit den Parametern ReconstructionMethodReconstructionMethodReconstructionMethodReconstructionMethodreconstructionMethod, GenParamNameGenParamNameGenParamNameGenParamNamegenParamName und GenParamValueGenParamValueGenParamValueGenParamValuegenParamValue kontrolliert werden. Für weitere Informationen zu den Parametern verweisen wir auf die Beschreibung des Operators reconstruct_height_field_from_gradientreconstruct_height_field_from_gradientReconstructHeightFieldFromGradientReconstructHeightFieldFromGradientReconstructHeightFieldFromGradient. Ist ResultTypeResultTypeResultTypeResultTyperesultType so gesetzt, dass kein Höhenmodell zurückgegeben wird, werden diese Parameter ignoriert.

Achtung

photometric_stereophotometric_stereoPhotometricStereoPhotometricStereoPhotometricStereo setzt quadratische Pixel voraus. Außerdem wird vorausgesetzt, dass die Höhen auf einem Gitter der Schrittweite 1 im Objektraum vorliegen. Ist das nicht der Fall, d.h., wenn die Pixelgröße der Kamera projiziert in den Objektraum von 1 abweicht, müssen die zurückgegebenen Höhen mit der tatsächlichen Gitterschrittweite (Wert der Pixelgröße projiziert in den Objektraum) multipliziert werden. Die Größe des Pixels im Objektraum wird berechnet, indem die Größe des Pixels in der Kamera durch die Vergrößerung der (telezentrischen) Linse geteilt wird.

Ausführungsinformationen

Parameter

ImagesImagesImagesImagesimages (input_object)  singlechannelimage(-array) objectHImageHImageHobject (byte / uint2)

Array mit mindestens drei Bildern mit unterschiedlicher Beleuchtungsrichtung.

HeightFieldHeightFieldHeightFieldHeightFieldheightField (output_object)  image objectHImageHImageHobject * (real)

Rekonstruiertes Höhenmodell.

GradientGradientGradientGradientgradient (output_object)  image objectHImageHImageHobject * (vector_field)

Gradientenfeld der Oberfläche.

AlbedoAlbedoAlbedoAlbedoalbedo (output_object)  image objectHImageHImageHobject * (real)

Albedo der Oberfläche.

SlantsSlantsSlantsSlantsslants (input_control)  angle.deg-array HTupleHTupleHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong)

Winkel zwischen der Kamera und der Richtung der Lichtquelle (im Gradmaß).

Defaultwert: 45.0

Wertevorschläge: 1.0, 5.0, 10.0, 20.0, 40.0, 60.0, 90.0

Typischer Wertebereich: 0.0 ≤ Slants Slants Slants Slants slants ≤ 180.0 (lin)

Minimale Schrittweite: 0.01

Empfohlene Schrittweite: 10.0

TiltsTiltsTiltsTiltstilts (input_control)  angle.deg-array HTupleHTupleHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong)

Winkel der Richtung der Lichtquelle innerhalb der Objektebene (im Gradmaß).

Defaultwert: 45.0

Wertevorschläge: 1.0, 5.0, 10.0, 20.0, 40.0, 60.0, 90.0

Typischer Wertebereich: 0.0 ≤ Tilts Tilts Tilts Tilts tilts ≤ 360.0 (lin)

Minimale Schrittweite: 0.01

Empfohlene Schrittweite: 10.0

ResultTypeResultTypeResultTypeResultTyperesultType (input_control)  string-array HTupleHTupleHtuple (string) (string) (HString) (char*)

Zu berechnende ikonische Ergebnisse.

Defaultwert: 'all' "all" "all" "all" "all"

Werteliste: [], 'albedo'"albedo""albedo""albedo""albedo", 'all'"all""all""all""all", 'gradient'"gradient""gradient""gradient""gradient", 'height_field'"height_field""height_field""height_field""height_field", 'normalized_gradient'"normalized_gradient""normalized_gradient""normalized_gradient""normalized_gradient"

ReconstructionMethodReconstructionMethodReconstructionMethodReconstructionMethodreconstructionMethod (input_control)  string HTupleHTupleHtuple (string) (string) (HString) (char*)

Typ der Rekonstruktionsmethode.

Defaultwert: 'poisson' "poisson" "poisson" "poisson" "poisson"

Werteliste: 'fft_cyclic'"fft_cyclic""fft_cyclic""fft_cyclic""fft_cyclic", 'poisson'"poisson""poisson""poisson""poisson", 'rft_cyclic'"rft_cyclic""rft_cyclic""rft_cyclic""rft_cyclic"

GenParamNameGenParamNameGenParamNameGenParamNamegenParamName (input_control)  string-array HTupleHTupleHtuple (string) (string) (HString) (char*)

Namen der generischen Parameter.

Defaultwert: []

Werteliste: 'caching'"caching""caching""caching""caching", 'optimize_speed'"optimize_speed""optimize_speed""optimize_speed""optimize_speed"

GenParamValueGenParamValueGenParamValueGenParamValuegenParamValue (input_control)  integer-array HTupleHTupleHtuple (integer / real / string) (int / long / double / string) (Hlong / double / HString) (Hlong / double / char*)

Werte der generischen Parameter.

Defaultwert: []

Werteliste: 'exhaustive'"exhaustive""exhaustive""exhaustive""exhaustive", 'free_cache'"free_cache""free_cache""free_cache""free_cache", 'no_cache'"no_cache""no_cache""no_cache""no_cache", 'patient'"patient""patient""patient""patient", 'standard'"standard""standard""standard""standard", 'use_cache'"use_cache""use_cache""use_cache""use_cache"

Ergebnis

Sind die Parameterwerte korrekt, dann liefert photometric_stereophotometric_stereoPhotometricStereoPhotometricStereoPhotometricStereo den Wert 2 (H_MSG_TRUE), sonst eine Fehlermeldung.

Vorgänger

optimize_fft_speedoptimize_fft_speedOptimizeFftSpeedOptimizeFftSpeedOptimizeFftSpeed

Modul

3D Metrology