photometric_stereoT_photometric_stereoPhotometricStereoPhotometricStereophotometric_stereo (Operator)

Name

photometric_stereoT_photometric_stereoPhotometricStereoPhotometricStereophotometric_stereo — 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)

def photometric_stereo(images: HObject, slants: Sequence[Union[float, int]], tilts: Sequence[Union[float, int]], result_type: Sequence[str], reconstruction_method: str, gen_param_name: Sequence[str], gen_param_value: Sequence[Union[int, float, str]]) -> Tuple[HObject, HObject, HObject]

Beschreibung

photometric_stereophotometric_stereoPhotometricStereoPhotometricStereoPhotometricStereophotometric_stereo 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 Reflexionscharakteristik 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_stereoPhotometricStereoPhotometricStereoPhotometricStereophotometric_stereo 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 Reflexionseigenschaften 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 SlantsSlantsSlantsSlantsslantsslants und TiltsTiltsTiltsTiltstiltstilts 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:

SlantsSlantsSlantsSlantsslantsslants
Der Neigungswinkel (SlantsSlantsSlantsSlantsslantsslants) ist der Winkel zwischen der optischen Achse der Kamera und der Beleuchtungsrichtung.
image/svg+xml Slant
Seitenansicht
TiltsTiltsTiltsTiltstiltstilts
Der Winkel in TiltsTiltsTiltsTiltstiltstilts 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 SlantsSlantsSlantsSlantsslantsslants zwischen 30° und 60° betragen. Die Winkel in TiltsTiltsTiltsTiltstiltstilts 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 ImagesImagesImagesImagesimagesimages ü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_channelsImageToChannelsImageToChannelsImageToChannelsimage_to_channels in einen Bildarray konvertiert werden. Alternativ kann ein Bildarray mittels concat_objconcat_objConcatObjConcatObjConcatObjconcat_obj erzeugt werden.

photometric_stereophotometric_stereoPhotometricStereoPhotometricStereoPhotometricStereophotometric_stereo 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 Charakteristik aufweist. Mit dem Operator radiometric_self_calibrationradiometric_self_calibrationRadiometricSelfCalibrationRadiometricSelfCalibrationRadiometricSelfCalibrationradiometric_self_calibration kann die Charakteristik der Kamera bestimmt werden und mit lut_translut_transLutTransLutTransLutTranslut_trans 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 (GradientGradientGradientGradientgradientgradient), den Albedo (AlbedoAlbedoAlbedoAlbedoalbedoalbedo) und das Höhenmodell (HeightFieldHeightFieldHeightFieldHeightFieldheightFieldheight_field) der Oberfläche zurückgeben:

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

Intern ermittelt photometric_stereophotometric_stereoPhotometricStereoPhotometricStereoPhotometricStereophotometric_stereo 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_gradientReconstructHeightFieldFromGradientReconstructHeightFieldFromGradientReconstructHeightFieldFromGradientreconstruct_height_field_from_gradient zur Verfügung stehen und mit den Parametern ReconstructionMethodReconstructionMethodReconstructionMethodReconstructionMethodreconstructionMethodreconstruction_method, GenParamNameGenParamNameGenParamNameGenParamNamegenParamNamegen_param_name und GenParamValueGenParamValueGenParamValueGenParamValuegenParamValuegen_param_value kontrolliert werden. Für weitere Informationen zu den Parametern verweisen wir auf die Beschreibung des Operators reconstruct_height_field_from_gradientreconstruct_height_field_from_gradientReconstructHeightFieldFromGradientReconstructHeightFieldFromGradientReconstructHeightFieldFromGradientreconstruct_height_field_from_gradient. Ist ResultTypeResultTypeResultTypeResultTyperesultTyperesult_type so gesetzt, dass kein Höhenmodell zurückgegeben wird, werden diese Parameter ignoriert.

Achtung

photometric_stereophotometric_stereoPhotometricStereoPhotometricStereoPhotometricStereophotometric_stereo 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

ImagesImagesImagesImagesimagesimages (input_object)  singlechannelimage(-array) objectHImageHObjectHImageHobject (byte / uint2)

Array mit mindestens drei Bildern mit unterschiedlicher Beleuchtungsrichtung.

HeightFieldHeightFieldHeightFieldHeightFieldheightFieldheight_field (output_object)  image objectHImageHObjectHImageHobject * (real)

Rekonstruiertes Höhenmodell.

GradientGradientGradientGradientgradientgradient (output_object)  image objectHImageHObjectHImageHobject * (vector_field)

Gradientenfeld der Oberfläche.

AlbedoAlbedoAlbedoAlbedoalbedoalbedo (output_object)  image objectHImageHObjectHImageHobject * (real)

Albedo der Oberfläche.

SlantsSlantsSlantsSlantsslantsslants (input_control)  angle.deg-array HTupleSequence[Union[float, int]]HTupleHtuple (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 slants ≤ 180.0 (lin)

Minimale Schrittweite: 0.01

Empfohlene Schrittweite: 10.0

TiltsTiltsTiltsTiltstiltstilts (input_control)  angle.deg-array HTupleSequence[Union[float, int]]HTupleHtuple (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 tilts ≤ 360.0 (lin)

Minimale Schrittweite: 0.01

Empfohlene Schrittweite: 10.0

ResultTypeResultTypeResultTypeResultTyperesultTyperesult_type (input_control)  string-array HTupleSequence[str]HTupleHtuple (string) (string) (HString) (char*)

Zu berechnende ikonische Ergebnisse.

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

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

ReconstructionMethodReconstructionMethodReconstructionMethodReconstructionMethodreconstructionMethodreconstruction_method (input_control)  string HTuplestrHTupleHtuple (string) (string) (HString) (char*)

Typ der Rekonstruktionsmethode.

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

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

GenParamNameGenParamNameGenParamNameGenParamNamegenParamNamegen_param_name (input_control)  string-array HTupleSequence[str]HTupleHtuple (string) (string) (HString) (char*)

Namen der generischen Parameter.

Defaultwert: []

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

GenParamValueGenParamValueGenParamValueGenParamValuegenParamValuegen_param_value (input_control)  integer-array HTupleSequence[Union[int, float, str]]HTupleHtuple (integer / real / string) (int / long / double / string) (Hlong / double / HString) (Hlong / double / char*)

Werte der generischen Parameter.

Defaultwert: []

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

Ergebnis

Sind die Parameterwerte korrekt, dann liefert photometric_stereophotometric_stereoPhotometricStereoPhotometricStereoPhotometricStereophotometric_stereo den Wert TRUE, sonst eine Fehlermeldung.

Vorgänger

optimize_fft_speedoptimize_fft_speedOptimizeFftSpeedOptimizeFftSpeedOptimizeFftSpeedoptimize_fft_speed

Modul

3D Metrology