adjust_mosaic_imagesT_adjust_mosaic_imagesAdjustMosaicImagesAdjustMosaicImages (Operator)

Name

adjust_mosaic_imagesT_adjust_mosaic_imagesAdjustMosaicImagesAdjustMosaicImages — Anwenden einer automatischen Farbkorrektur auf Bilder in Panoramen.

Signatur

adjust_mosaic_images(Images : CorrectedImages : From, To, ReferenceImage, HomMatrices2D, EstimationMethod, EstimateParameters, OECFModel : )

Herror T_adjust_mosaic_images(const Hobject Images, Hobject* CorrectedImages, const Htuple From, const Htuple To, const Htuple ReferenceImage, const Htuple HomMatrices2D, const Htuple EstimationMethod, const Htuple EstimateParameters, const Htuple OECFModel)

void AdjustMosaicImages(const HObject& Images, HObject* CorrectedImages, const HTuple& From, const HTuple& To, const HTuple& ReferenceImage, const HTuple& HomMatrices2D, const HTuple& EstimationMethod, const HTuple& EstimateParameters, const HTuple& OECFModel)

HImage HImage::AdjustMosaicImages(const HTuple& From, const HTuple& To, Hlong ReferenceImage, const HTuple& HomMatrices2D, const HString& EstimationMethod, const HTuple& EstimateParameters, const HString& OECFModel) const

HImage HImage::AdjustMosaicImages(const HTuple& From, const HTuple& To, Hlong ReferenceImage, const HTuple& HomMatrices2D, const HString& EstimationMethod, const HString& EstimateParameters, const HString& OECFModel) const

HImage HImage::AdjustMosaicImages(const HTuple& From, const HTuple& To, Hlong ReferenceImage, const HTuple& HomMatrices2D, const char* EstimationMethod, const char* EstimateParameters, const char* OECFModel) const

HImage HImage::AdjustMosaicImages(const HTuple& From, const HTuple& To, Hlong ReferenceImage, const HTuple& HomMatrices2D, const wchar_t* EstimationMethod, const wchar_t* EstimateParameters, const wchar_t* OECFModel) const   (Nur Windows)

static void HOperatorSet.AdjustMosaicImages(HObject images, out HObject correctedImages, HTuple from, HTuple to, HTuple referenceImage, HTuple homMatrices2D, HTuple estimationMethod, HTuple estimateParameters, HTuple OECFModel)

HImage HImage.AdjustMosaicImages(HTuple from, HTuple to, int referenceImage, HTuple homMatrices2D, string estimationMethod, HTuple estimateParameters, string OECFModel)

HImage HImage.AdjustMosaicImages(HTuple from, HTuple to, int referenceImage, HTuple homMatrices2D, string estimationMethod, string estimateParameters, string OECFModel)

Beschreibung

adjust_mosaic_imagesadjust_mosaic_imagesAdjustMosaicImagesAdjustMosaicImagesAdjustMosaicImages führt eine radiometrische Anpassung von Bildern in Panoramen durch. Die zu korrigierenden Bilder werden im Parameter ImagesImagesImagesImagesimages gegeben, die korrigierten Bilder werden in CorrectedImagesCorrectedImagesCorrectedImagesCorrectedImagescorrectedImages zurück geliefert.

Die Parameter FromFromFromFromfrom und ToToToToto geben die Start- und Zielindizes der einzelnen Bildpaare innerhalb des Panoramas an. Zu jedem dieser Paare muss im Parameter HomMatrices2DHomMatrices2DHomMatrices2DHomMatrices2DhomMatrices2D die entsprechende projektive 3x3-Matrix gegeben werden. Der Parameter ReferenceImageReferenceImageReferenceImageReferenceImagereferenceImage legt das Bild fest, dessen Helligkeit und Weißabgleich als Referenz verwendet werden sollen.

Das bedeutet, dass ein Bild über 'perfekte' Belichtung und Weißabgleich verfügt. Alle anderen Bilder werden entsprechend angepasst, so dass deren Belichtung und Weißabgleich dem Referenzbild entspricht. Das Referenzbild wird also nicht verändert, alle anderen Bilder hingegen schon.

EstimationMethodEstimationMethodEstimationMethodEstimationMethodestimationMethod bestimmt, ob nur eine ungenaue, aber dafür schnelle Anpassung durchgeführt werden soll, oder eine langsamere, aber dafür wesentlich genauere. Dies wird mit den Werten 'standard'"standard""standard""standard""standard" bzw. 'gold_standard'"gold_standard""gold_standard""gold_standard""gold_standard" festgelegt.

Die Verfahren, die mit 'standard'"standard""standard""standard""standard" gewählt werden können verwenden nur den durchschnittlichen Grauwertunterschied im Überlappbereich jedes Bildpaares. Wenn 'gold_standard'"gold_standard""gold_standard""gold_standard""gold_standard" gewählt ist werden dagegen die Grauwertunterschiede zwischen allen korrespondierenden Bildpunkten im Überlappbereich berücksichtigt.

Die zu minimierende Fehlerfunktion ergibt sich in allen Fällen als die Quadratsumme der Grauwertunterschiede zwischen den Bildern bzw. Bildpunkten.

Die Verfügbarkeit der einzelnen Methoden ist jedoch abhängig von den gewählten EstimateParametersEstimateParametersEstimateParametersEstimateParametersestimateParameters. Dieser Parameter bestimmt, welches Modell zur Bestimmung der radiometrischen Korrektur verwendet werden soll. Es ist prinzipiell immer möglich, die Vignettierung der Bilder durch Angabe von 'vignetting'"vignetting""vignetting""vignetting""vignetting" bestimmen zu lassen. In diesem Fall muss jedoch für EstimationMethodEstimationMethodEstimationMethodEstimationMethodestimationMethod auch 'gold_standard'"gold_standard""gold_standard""gold_standard""gold_standard" gewählt werden. Für die sonstigen radiometrischen Korrekturen bietet das Verfahren drei Optionen:

Die Bestimmung der Vignettierung in Bilder basiert auf dem weithin bekannten Ansatz. Dabei wird angenommen, dass die Vignettierung im Mittelpunkt des Bildes nicht existiert und mit dem Öffnungswinkel des Objektivs gemäß der obigen Gleichung zunimmt.

1. Die Korrektur mit Hilfe eines additiven Verfahrens. Diese ist lediglich für kleinste Unterschiede zu verwenden. Sie wird durch Angabe des Wertes 'add_gray'"add_gray""add_gray""add_gray""add_gray" in EstimateParametersEstimateParametersEstimateParametersEstimateParametersestimateParameters gewählt. Dieses Modell kann nur alleine mit EstimationMethodEstimationMethodEstimationMethodEstimationMethodestimationMethod = 'standard'"standard""standard""standard""standard", oder gemeinsam mit EstimateParametersEstimateParametersEstimateParametersEstimateParametersestimateParameters = 'vignetting'"vignetting""vignetting""vignetting""vignetting" mit EstimationMethodEstimationMethodEstimationMethodEstimationMethodestimationMethod = 'gold_standard'"gold_standard""gold_standard""gold_standard""gold_standard" gewählt werden.

Dieses Verfahren basiert auf der Annahme, dass die Grauwertunterschiede zwischen den Bildern dadurch korrigiert werden können, dass zu den Grauwerten in jedem Bild ein bestimmter Term addiert wird. Dies entspricht im Grunde genau einem Aufruf von scale_imagescale_imageScaleImageScaleImageScaleImage für jedes Bild:

scale_image(Image_n,CorrectedImage_n,1.0,Add_n)

mit Add_n dem Korrekturterm für dieses Bild.

2. Die Korrektur mit Hilfe des linearen Verfahrens. In diesem Fall wird angenommen, dass die Eingabebilder mit einer linearen Kamera aufgenommen wurden. Die Unterschiede zwischen den einzelnen Bildern werden als Multiplikationsfaktoren berechnet, mit denen die Bilder korrigiert werden. Dieses Verfahren wird durch Angabe von 'mult_gray'"mult_gray""mult_gray""mult_gray""mult_gray" gewählt. Es kann sowohl mit EstimationMethodEstimationMethodEstimationMethodEstimationMethodestimationMethod = 'standard'"standard""standard""standard""standard", als auch mit EstimationMethodEstimationMethodEstimationMethodEstimationMethodestimationMethod = 'gold_standard'"gold_standard""gold_standard""gold_standard""gold_standard" durchgeführt werden. Die Kombination mit EstimateParametersEstimateParametersEstimateParametersEstimateParametersestimateParameters = 'vignetting'"vignetting""vignetting""vignetting""vignetting" ist ebenfalls möglich, jedoch nur mit EstimationMethodEstimationMethodEstimationMethodEstimationMethodestimationMethod = 'gold_standard'"gold_standard""gold_standard""gold_standard""gold_standard".

Dieses Verfahren basiert auf der Annahme, dass die Grauwertunterschiede zwischen den Bildern dadurch korrigiert werden können, dass die Grauwerte in jedem Bild mit einem bestimmten Faktor multipliziert werden. Dies entspricht wieder genau einem Aufruf von scale_imagescale_imageScaleImageScaleImageScaleImage für jedes Bild:

scale_image(Image_n,CorrectedImage_n,Mult_n,0)

mit Mult_n dem Korrekturfaktor für dieses Bild.

3. Die Korrektur mit Hilfe des kalibrierten Verfahrens. Bei diesem Modell wird angenommen, dass die Eingabebilder mit einer nichtlinearen Kamera aufgenommen wurden. Zur Modellierung der Transferfunktion wird die im Parameter OECFModelOECFModelOECFModelOECFModelOECFModel gewählte Funktionsklasse verwendet. Zusätzlich werden genau wie im linearen Fall die Unterschiede zwischen den Bildern als Multiplikationsfaktoren berechnet und die Bilder entsprechend korrigiert. Dieses Modell wird durch Angabe von ['mult_gray', 'response']["mult_gray", "response"]["mult_gray", "response"]["mult_gray", "response"]["mult_gray", "response"] gewählt und kann nur mit EstimationMethodEstimationMethodEstimationMethodEstimationMethodestimationMethod = 'gold_standard'"gold_standard""gold_standard""gold_standard""gold_standard" ausgewählt werden. Eine Kombination mit EstimateParametersEstimateParametersEstimateParametersEstimateParametersestimateParameters = 'vignetting'"vignetting""vignetting""vignetting""vignetting" ist möglich.

Dieses Verfahren ist dem linearen Verfahren ähnlich. In diesem Fall kann die Kamera jedoch eine nichtlineare Antwortfunktion besitzen. Dies bedeutet, dass die Grauwerte der Bilder zuerst wieder linearisiert werden müssen, bevor sie mit einem Skalierungsfaktor multipliziert werden können. Um diesen Schritt vornehmen zu können muss die Antwortfunktion der Kamera bestimmt werden. Da diese normalerweise innerhalb einer Bildsequenz nicht variiert, wird sie als konstant über alle Bilder angenommen.

Prinzipiell könnte jede Art von Funktion als OECF verwendet werden. So ist es zum Beispiel denkbar polynomielle Funktionen wie in radiometric_self_calibrationradiometric_self_calibrationRadiometricSelfCalibrationRadiometricSelfCalibrationRadiometricSelfCalibration zu verwenden. Diese Art von Funktion wäre jedoch in der vorliegenden Anwendung zu komplex und würde nicht zu zufriedenstellenden Ergebnissen führen. Der Grund liegt darin, dass eine solche Funktion über zu viele Parameter verfügt. Stattdessen werden nur einfachere Funktionstypen unterstützt. Derzeit sind lediglich sogenannte Laguerre-Funktionen verfügbar.

Die Antwortfunktion einer OECF der Laguerre-Klasse wird von nur einem Parameter mit dem Namen Phi definiert. Im ersten Schritt der Transformation wird also das Grauwertspektrum (für 8bit Bilder also die Werte zwischen 0 und 255) in das Intervall [0:1] abgebildet. Die resultierenden Fließkommazahlen werden dann mittels der OECF linearisiert und die resultierenden Werte werden wieder in das Ursprungsintervall projiziert.

Die inverse Antwortfunktion, mit der Grauwerte wieder linearisiert werden können lässt sich für Laguerre-Funktionen wie folgt berechnen:

mit I_l dem linearen Grauwert und I_nl dem nichtlinearen Grauwert.

Der Parameter OECFModelOECFModelOECFModelOECFModelOECFModel wird nur verwendet, wenn eine Korrektur mittels des kalibrierten Verfahrens durchgeführt wird. Andernfalls werden eventuelle Eingaben ignoriert.

Der Parameter EstimateParametersEstimateParametersEstimateParametersEstimateParametersestimateParameters kann auch dazu benutzt werden, das Laufzeitverhalten und den Speicherverbrauch des Operators zu beeinflussen. Wird der Parameter auf 'no_cache'"no_cache""no_cache""no_cache""no_cache" gesetzt, so wird der interne Cache Mechanismus des Operators abgeschaltet. Dies bedeutet aber auch, dass diese Einstellung nur dann eine Wirkung hat, wenn EstimationMethodEstimationMethodEstimationMethodEstimationMethodestimationMethod auf 'gold_standard'"gold_standard""gold_standard""gold_standard""gold_standard" gesetzt ist. Andernfalls wird die Einstellung ignoriert. Wird der interne Cache Mechanismus abgeschaltet, so benötigt der Operator deutlich weniger Arbeitsspeicher, da die korrespondierenden Grauwertpaare in jeder Iteration der Minimierung erneut berechnet werden. Aus diesem Grund ist die Abschaltung des internen Cache Mechanismus nur dann angeraten, wenn der Speicherbedarf des Operators den verfügbaren physikalischen Speicher des Rechners übersteigt und das Betriebssystem daher auf die Auslagerungsdatei zurück greift.

Eine weitere Möglichkeit die Laufzeit und den Speicherverbrauch zu beeinflussen bietet sich durch die Verwendung von Subsampling. Wird EstimateParametersEstimateParametersEstimateParametersEstimateParametersestimateParameters auf 'subsampling_2'"subsampling_2""subsampling_2""subsampling_2""subsampling_2" gesetzt, so werden alle Bilder intern um den Faktor 2 verkleinert. Im Gegensatz zu den unten aufgeführten Vorschlägen sind nicht nur die Faktoren 2 und 4 verfügbar, sondern ein beliebiger Ganzzahlwert kann dadurch angegeben werden, dass er an subsampling_ in EstimateParametersEstimateParametersEstimateParametersEstimateParametersestimateParameters angehängt wird. Durch dieses Vorgehen kann die gesamte Datenmenge erheblich reduziert werden, was sich in einer deutlich geringeren Laufzeit des verwendeten Minimierungsalgorithmus bemerkbar macht. Zusätzlich kann ein leichtes Subsampling sogar das Ergebnis der Korrektur verbessern, da dadurch der Einfluss von geringfügigen Abbildungsfehlern zwischen den Bildern verringert wird. Obwohl Subsampling auch die Laufzeit beeinflusst, wenn EstimationMethodEstimationMethodEstimationMethodEstimationMethodestimationMethod auf 'standard'"standard""standard""standard""standard" gesetzt ist, wird die Verwendung hauptsächlich für 'gold_standard'"gold_standard""gold_standard""gold_standard""gold_standard" empfohlen.

Hier noch einige allgemeine Anmerkungen zur Verwendung von adjust_mosaic_images:

Ausführungsinformationen

Parameter

ImagesImagesImagesImagesimages (input_object)  (multichannel-)image-array objectHImageHImageHobject (byte)

Eingabebilder.

CorrectedImagesCorrectedImagesCorrectedImagesCorrectedImagescorrectedImages (output_object)  (multichannel-)image-array objectHImageHImageHobject * (byte)

Ausgabebilder.

FromFromFromFromfrom (input_control)  integer-array HTupleHTupleHtuple (integer) (int / long) (Hlong) (Hlong)

Liste der Startbilder.

ToToToToto (input_control)  integer-array HTupleHTupleHtuple (integer) (int / long) (Hlong) (Hlong)

Liste der Zielbilder.

ReferenceImageReferenceImageReferenceImageReferenceImagereferenceImage (input_control)  integer HTupleHTupleHtuple (integer) (int / long) (Hlong) (Hlong)

Referenzbild.

HomMatrices2DHomMatrices2DHomMatrices2DHomMatrices2DhomMatrices2D (input_control)  real-array HTupleHTupleHtuple (real) (double) (double) (double)

Projektive Matrizen.

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

Schätzalgorithmus für die Korrektur.

Defaultwert: 'standard' "standard" "standard" "standard" "standard"

Werteliste: 'gold_standard'"gold_standard""gold_standard""gold_standard""gold_standard", 'standard'"standard""standard""standard""standard"

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

Zu bestimmende Parameter.

Defaultwert: ['mult_gray'] ["mult_gray"] ["mult_gray"] ["mult_gray"] ["mult_gray"]

Wertevorschläge: 'add_gray'"add_gray""add_gray""add_gray""add_gray", 'mult_gray'"mult_gray""mult_gray""mult_gray""mult_gray", 'response'"response""response""response""response", 'vignetting'"vignetting""vignetting""vignetting""vignetting", 'subsampling_2'"subsampling_2""subsampling_2""subsampling_2""subsampling_2", 'subsampling_4'"subsampling_4""subsampling_4""subsampling_4""subsampling_4", 'no_cache'"no_cache""no_cache""no_cache""no_cache"

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

Modell zur Bestimmung der OECF.

Defaultwert: ['laguerre'] ["laguerre"] ["laguerre"] ["laguerre"] ["laguerre"]

Werteliste: 'laguerre'"laguerre""laguerre""laguerre""laguerre"

Beispiel (HDevelop)

* For the input data to stationary_camera_self_calibration, please
* refer to the example for stationary_camera_self_calibration.
stationary_camera_self_calibration (4, 640, 480, 1, From, To, \
                                    HomMatrices2D, Rows1, Cols1, \
                                    Rows2, Cols2, NumMatches, \
                                    'gold_standard', \
                                    ['focus','principal_point'], \
                                    'true', CameraMatrix, Kappa, \
                                    RotationMatrices, X, Y, Z, Error)
adjust_mosaic_images(Images,CorrectedImages,From,To,1,HomMatrices2D, \
                     'gold_standard',['mult_gray','response'],'laguerre')

Ergebnis

Sind die Parameterwerte korrekt, dann liefert adjust_mosaic_imagesadjust_mosaic_imagesAdjustMosaicImagesAdjustMosaicImagesAdjustMosaicImages den Wert 2 (H_MSG_TRUE). Gegebenenfalls wird eine Fehlerbehandlung durchgeführt.

Vorgänger

stationary_camera_self_calibrationstationary_camera_self_calibrationStationaryCameraSelfCalibrationStationaryCameraSelfCalibrationStationaryCameraSelfCalibration

Nachfolger

gen_spherical_mosaicgen_spherical_mosaicGenSphericalMosaicGenSphericalMosaicGenSphericalMosaic

Literatur

David Hasler, Sabine Süsstrunk: Mapping colour in image stitching applications. Journal of Visual Communication and Image Representation, 15(1):65-90, 2004.

Modul

Foundation