binocular_disparity_mg
— Berechnet die Disparität für ein rektifiziertes Bildpaar mit Hife
von Mehrgitter-Verfahren.
binocular_disparity_mg(ImageRect1, ImageRect2 : Disparity, Score : GrayConstancy, GradientConstancy, Smoothness, InitialGuess, CalculateScore, MGParamName, MGParamValue : )
binocular_disparity_mg
berechnet die Disparität zwischen
zwei rektifizierten Stereobildern ImageRect1
und
ImageRect2
und gibt sie in Disparity
zurück. Im
Gegensatz zu binocular_disparity
werden Variationsmethoden
basierend auf Mehrgitter-Verfahren verwendet. Damit können
Disparitätswerte auch für Bildbereiche bestimmt werden, die keine
oder kaum Textur aufweisen. Im Gegensatz zu
binocular_distance_mg
wird das Ergebnis nicht in
Abstandswerte umgerechnet.
Die Eingabebilder müssen ein Paar rektifizierter Stereobilder darstellen, d.h. korrespondierende Punkte müssen dieselbe vertikale Koordinate haben. Die beiden Bilder müssen die gleiche Höhe haben, können aber unterschiedliche Breiten besitzen. Die Laufzeit des Verfahrens ist bei sonst gleichen Parametern in etwa linear zur Fläche der beiden Bilder.
Die Disparität gibt für jeden Bildpunkt des ersten Bildes
ImageRect1
die Verschiebung an, die nötig ist um seinen
korrespondierenden Punkt im zweiten Bild ImageRect2
zu
erreichen. Zwei Punkte des ersten und zweiten Bildes heißen dabei
korrespondierend, wenn sie der Bildpunkt desselben Punktes aus der
ursprünglichen Szene sind. Das berechnete Disparitätsfeld ist dicht
und schätzt die Disparität auch für Punkte ohne korrespondierenden
Punkt ab. Die Disparität wird nur für die Zeilen berechnet, die Teil
der Definitionsbereiche beider Bilder sind. Genauer gesagt berechnet
sich der Definitionsbereich des Disparitätsbildes aus der
Schnittmenge der Höhen der kleinsten umschließenden Rechtecke der
Definitionsbereiche der Eingabebilder.
Das berechnete Disparitätsfeld ist in der Regel nicht perfekt. Wenn
CalculateScore
auf 'true' gesetzt ist, wird die
Güte der Disparität für jedes Pixel geschätzt und in Score
als Grauwertbild mit Grauwerten im Bereich 0-10 zurückgegeben, wobei
0 für die beste und 10 für die schlechteste Qualität steht. Für das
Gütemaß wird zusätzlich die Disparität vom zweiten zum ersten Bild
berechnet und anschließend bestimmt, inwieweit die beiden
Disparitätsfelder übereinstimmen. Daher verdoppelt sich die
Laufzeit des Operators beim Aktivieren dieses Schalters in etwa.
Der Operator verwendet einen Variationsansatz, bei welchem jedem möglichen Disparitätsfeld ein Energiewert zugeordnet wird. Je geringer dieser Energiewert ist, desto besser wird das Disparitätsfeld bewertet. Das Verfahren berechnet ein Disparitätsfeld mit minimaler Energie und liefert dieses zurück.
Die einem Disparitätsfeld zugeordnete Energie zerfällt in einen Datenanteil und einen Glättungsanteil. Der Datenanteil modelliert die Tatsache, dass die Bilder in Bereichen korrespondierender Punkte Abbildungen desselben Teils der Szene sind und daher dieselben Grauwerte aufweisen. Der Glättungsanteil modelliert, dass die abgebildete Szene und die zugehörige Disparität stückweise glatt ist, und führt zu einer Interpolation der Werte auch in Bereiche ohne Informationen aus dem Datenanteil, z.B. Bereiche ohne Textur.
Im Detail liegen dem Variationsansatz die folgenden Annahmen zu Grunde:
Konstanz des Grauwerts: Es wird davon ausgegangen, dass zwei korrespondierende Punkte denselben Grauwert haben, dass also gilt.
Konstanz des Grauwertgradienten: Es wird angenommen, dass die Bilder an den Stellen zweier korrespondierender Punkte denselben Grauwertgradienten aufweisen, dass also gilt. Abweichungen davon werden energetisch mittels der -Norm der Differenz der beiden Gradienten bestraft. Die Verwendung des Gradienten hat im Vergleich zur Grauwertkonstanz den Vorteil, dass er unabhängig von additiven Helligkeitsänderungen zwischen den beiden Bildern ist.
Statistische Robustheit im Datenterm: Um den Einfluss von Ausreißern, also Punkten, die eine der beiden Erhaltungsannahmen verletzen, zu reduzieren, werden Abweichungen von den beiden obigen Erhaltungsannahmen mittels einer statistisch robusten Funktion, der totalen Variation, bestraft. Diese lautet . Die Konstante wird dabei auf 0.01 gesetzt.
Glattheit des Disparitätsfeldes: Es wird davon ausgegangen, dass das Disparitätsfeld stückweise stetig ist und sich lokal nur gering ändert. Energetisch wird dies über die -Norm der Ableitung der Disparität modelliert.
Statistische Robustheit im Glättungsterm: Analog zum Datenterm wird auch im Glättungsterm die totale Variation verwendet. Aufgrund der statistischen Robustheit gegenüber Ausreißern hat dies hier den Vorteil, dass Sprünge in der Disparität, wie sie an Objektkanten auftreten, besser erhalten bleiben.
Das Energiefunktional ergibt sich durch Integration einer
Linearkombination der einzelnen Terme über alle Bildpunkte des
ersten Bildes. Die Koeffizienten der Linearkombination sind dabei
Parameter des Operators und erlauben eine Abstimmung des Ansatzes
auf konkrete Situationen. GrayConstancy
bestimmt den
Einfluss der Grauwerterhaltung, GradientConstancy
den
Einfluss der Gradientenerhaltung und Smoothness
den
Einfluss des Glättungsterms. Die beiden ersten Parameter müssen
dabei an den Grauwertbereich des Bildes angepasst werden. Die
vorgeschlagenen Standardparameter gelten für Bilder mit Grauwerten
von 0 bis 255.
Es sei das Grauwert des ersten Bildes am Punkt (x,y), der Grauwert des zweiten Bildes und u(x,y) der Wert der Disparität an der Stelle (x,y). Das Energiefunktional ist dann:
Das Verfahren geht davon aus, dass das Disparitätsfeld u, welches dieses Funktional E minimiert, die obigen Annahmen am besten erfüllt, und daher eine gute Näherung der Disparität zwischen den beiden Bildern darstellt.
Um das obige Funktional zu minimieren, wird die sogenannte Euler-Lagrange-Gleichung (ELG) des Integrals gelöst. Diese ist vergleichbar mit der Ableitung eindimensionaler Funktionen, welche an Extrema 0 ist. Die ELG ist eine nichtlineare partielle Differentialgleichung auf dem Gebiet des Integrals und muss, analog zum eindimensionalen Fall, an Stellen von Extrema den Wert 0 annehmen. Da das Funktional in der Regel keine Maxima aufweist, entsprechen Nullstellen der ELG den gesuchten Minima des Funktionals.
Zur Bestimmung der Nullstellen der ELG werden folgende Techniken verwendet:
Fixpunkt-Iteration: Zum Lösen der ELG wird eine Fixpunkt-Iteration angewendet. Dies ist ein iteratives Verfahren, welches die Lösung schrittweise annähert, und in jedem Schritt eine Verbesserung der aktuellen Lösung berechnet. Über die Anzahl der Schritte kann daher zwischen Qualität und Geschwindigkeit abgewogen werden. Für jeden Schritt wird eine lineare partielle Differentialgleichung gelöst.
Grob-zu-Fein Verfahren: Von den beiden Stereobildern wird eine Gausssche Bildpyramide erstellt. Die ELG wird dabei zunächst für gröbere Versionen der Bilder gelöst, und die Lösung als Startwert der Fixpunkt-Iteration für die nächst feinere Version verwendet. Dies hat eine Reihe von Vor- und Nachteilen:
1. Da die Fixpunkt-Iteration von der nächstgröberen Ebene der Bildpyramide einen guten Startwert bekommt, sind weniger Iterationen nötig, wodurch das Verfahren schneller wird. Die Iteration muss nur noch kleine Korrekturen an der Disparität vornehmen.
2. Große Disparitäten auf den ursprünglichen Bildern werden auf den gröberen Bildversionen kleiner und können daher einfacher bestimmt werden.
3. Die Robustheit gegen Bildstörungen wird erhöht, da diese auf den groben Bildversionen verschwinden und auf den feinen Bildversionen lediglich kleine Korrekturen berechnet werden.
4. Probleme entstehen bei kleinen Strukturen mit großem Disparitätsunterschied zur Umgebung, da diese auf den gröberen Versionen der Bilder verschwinden und daher die Disparität der Umgebung berechnet wird. Da auf den feineren Versionen der Pyramide lediglich kleine Korrekturen berechnet werden, kann dieser Fehler nicht mehr korrigiert werden.
Mehrgitterverfahren: Die bei der Fixpunkt-Iteration entstehenden linearen partiellen Differentialgleichungen werden durch Linearisierung in ein lineares Gleichungssystem umgewandelt. Für die Lösung dieses Systems werden wiederum iterative Verfahren eingesetzt. Mehrgitterverfahren gehören bei den hier auftretenden Gleichungssystemen zu den effizientesten Lösungsverfahren. Sie nutzen die Tatsache, dass klassische Löser, etwa das Gauß-Seidel-Verfahren, hochfrequente Anteile des Fehlers schnell dämpfen, niederfrequente Anteile jedoch nur langsam. Mehrgitterverfahren berechnen den Fehler daher auf einem gröberen Gitter, auf welchem diese niederfrequenten Anteile des Fehlers eine höhere Frequenz bekommen und von den Lösern schneller gedämpft werden. Diese Eigenschaft wird von Mehrgitterverfahren rekursiv genutzt. Für die Berechnung des Fehlers auf der gröberen Version des Gleichungssystems wird also eine noch gröbere Version des Systems hinzugezogen. Je nach Anzahl der Korrekturschritte ergeben sich dadurch V- oder W-Zyklen als Aufrufschemata, welche im folgenden für zwei bis vier Auflösungsstufen dargestellt sind: Hierbei werden Iterationen auf dem Originalproblem mit großen Markierungen symbolisiert, während kleine Markierungen für Iterationen auf Fehlerkorrekturproblemen stehen.
Algorithmisch lässt sich ein solcher Korrekturzyklus wie folgt beschreiben:
1. In einem ersten Schritt werden einige wenige Iterationen mit einem iterativen linearen oder nichtlinearen Basislöser (z.B. einer Gauß-Seidel-Variante) gemacht. Dieser Schritt nennt sich Vorglättung.
2. In einem zweiten Schritt wird der aktuelle Fehler berechnet, um die bisherige Lösung (die Lösung nach Schritt 1) zu korrigieren. Aus Effizienzgründen findet diese Fehlerberechnung auf einer gröberen Auflösungsstufe statt. Dieser Schritt, der mehrfach wiederholt werden kann, nennt sich Grobgitterkorrekturschritt.
3. In einem letzten Schritt werden erneut einige wenige Iterationen mit dem gleichen iterativen linearen oder nichtlinearen Basislöser wie in Schritt 1 gemacht. Dieser Schritt nennt sich Nachglättung.
Weiterhin kann der Startwert der Iteration mittels eines hierarchischen Verfahrens bestimmt werden. Hierbei wird die Lösung vom gröbsten Gitter ausgehend immer weiter verbessert. Die skalierte Lösung auf einem gröberen Gitter dient dabei als Startwert für das nächst feinere Gitter. Auf jeder Gitterstufe wird das lineare Gleichungssystem durch einen der oben beschriebenen V- oder W-Zyklen gelöst. Das entsprechende Mehrgitterverfahren wird volles Mehrgitterverfahren genannt und kann wie folgt visualisiert werden: Dieses Beispiel stellt ein volles Mehrgitterverfahren mit zwei W-Korrekturzyklen pro Auflösungsstufe der hierarchischen Initialisierung dar. Die Interpolationsschritte der Lösung von einer Stufe zur nächsten sind mit i bezeichnet, die beiden W-Korrekturzyklen mit und . Während Iterationen auf dem Originalproblem mit großen Markierungen symbolisiert werden, stehen kleine Markierungen für Iterationen auf Fehlerkorrekturproblemen.
Je nach gewähltem Mehrgitterverfahren stehen eine Reihe von Parametern zu Verfügung, welche im Folgenden genauer beschrieben sind.
Der Parameter InitialGuess
gibt den Initialisierungswert
für die Fixpunkt-Iteration an, also den ersten Schätzwert. In der
Regel ist hier 0 ausreichend. Läuft das Verfahren jedoch in lokale
Minima, so kann hier ein anderer Wert übergeben werden.
Mittels der Parameter MGParamName
und MGParamValue
wird das Lösungsverfahren, also das Grob-zu-Fein-Verfahren, die
Fixpunkt-Iteration und das Mehrgitterverfahren gesteuert. In der
Regel reicht es aus, eine der vordefinierten und aufeinander
abgestimmten Parametergruppen zu verwenden. Hierfür wird
MGParamName
= 'default_parameters' und
MGParamValue
= 'very_accurate' ,
'accurate' , 'fast_accurate' oder 'fast'
gesetzt.
Sollen die Parameter einzeln gesteuert werden, so müssen in
MGParamName
und MGParamValue
zwei gleichlange
Tupel übergeben werden. Die Einträge in MGParamName
bestimmen dabei jeweils den zu setzenden Parameter, die Einträge in
MGParamValue
den zu setzenden Wert. Die Parameter werden
in der Reihenfolge ausgewertet, in welcher sie übergeben werden. Es
kann also auch zunächst eine Gruppe von Standardparametern gewählt
werden (s.o.) und danach gezielt einzelne Parameter verändert
werden. Im Folgenden werden die möglichen zu setzenden Parameter
beschrieben.
MGParamName
= 'mg_solver' wählt das
Lösungsverfahren für die linearen Gleichungssysteme aus. Mögliche
Werte für MGParamValue
sind 'multigrid' für ein
einfaches Mehrgitterverfahren, 'full_multigrid' für ein
volles Mehrgitterverfahren sowie 'gauss_seidel' für ein
Gauß-Seidel-Verfahren. Die Mehrgitterverfahren haben den Vorteil
einer schnelleren Konvergenz, benötigen jedoch einen zusätzlichen
Aufwand für das Vergröbern der linearen Gleichungssysteme.
MGParamName
= 'mg_cycle_type' wählt den
Rekursionstyp des Mehrgitterverfahrens aus. Mögliche Werte für
MGParamValue
sind 'v' für einen V-Zyklus,
'w' für einen W-Zyklus und 'none' für keine
Rekursion.
MGParamName
= 'mg_pre_relax' setzt für
Mehrgitterverfahren die Anzahl der Gauß-Seidel-Iterationen beim
Vorglätten, bzw. beim Gauß-Seidel-Verfahren die Anzahl an
Iterationen beim Lösen des Gleichungssystems. Der Wert muss eine Zahl
größer 0 sein.
MGParamName
= 'mg_post_relax' setzt für
Mehrgitterverfahren die Anzahl der Gauß-Seidel-Iterationen beim
Nachglätten. Der Wert muss eine Zahl größer 0 sein.
Beide gerade beschriebene Parameter gehen asymptotisch gesehen linear in die Laufzeit des Verfahrens ein. Da viele andere Berechnungen jedoch unabhängig von der Anzahl an Gauß-Seidel-Iterationen nur einmal nötig sind, führen kleine Änderungen der beiden Parameter nur zu kleinen Änderungen in der Laufzeit.
MGParamName
= 'initial_level' legt die gröbste
zu verwendende Stufe der Bildpyramide beim Grob-zu-Fein-Verfahren
fest. Dies kann entweder durch Angabe eines positiven Wertes
erfolgen, welcher die gröbste Ebene angibt. Ebene 0 ist dabei die
feinste Ebene mit den ursprünglichen Bildern. Alternativ kann ein
negativer Wert angegeben werden, welcher die gröbste zu verwendende
Stufe relativ zur gröbsten verfügbaren Stufe angibt. Die gröbste
verfügbare Stufe ist diejenige, auf welcher beide Bilder in beide
Koordinatenrichtungen eine Größe von mindestens 4 Pixeln aufweisen.
Wie unten angegeben, ist der Standardwert von
'initial_level' -2. Dies erlaubt die Bestimmung
der korrekten Disparität auch für Bilder, die sehr hohe Disparitäten
aufweisen. In Einzelfällen, z.B. bei sich wiederholenden Texturen,
kann dies allerdings dazu führen, dass zu große Disparitäten für
Teile des Bildes berechnet werden. In diesem Fall sollte
'initial_level' auf einen niedrigeren Wert gesetzt werden.
Bei Standardparametern werden die Bilder pro Pyramidenstufe um den Faktor 0.6 skaliert. Liegt eine Schätzung d der maximalen Disparität vor, so sollte die erste Ebene s so gewählt werden, dass größer als d ist.
MGParamName
= 'iterations' legt die Anzahl an
Fixpunkt-Iterationen pro Ebene fest. Die genaue Anzahl an
Iterationen bestimmt sich durch ,
wobei level die aktuelle Ebene in der Bildpyramide bezeichnet. Wird
dieser Parameter gleich 0 gesetzt, so wird auf der
Bildpyramidenebene 0 der ursprünglichen Bilder keine Iteration
durchgeführt und als Ergebnis das skalierte Resultat der Ebene 1
zurückgeliefert. Dies eignet sich für besonders schnelle Verfahren.
Die Anzahl an Iterationen geht annähernd linear in die Laufzeit des
Verfahrens ein.
MGParamName
= 'pyramid_factor' legt den
Skalierungsfaktor für die Bildpyramide des Grob-zu-Fein-Verfahrens
fest. Die Höhe und Breite des nächst kleineren Bildes wird dabei um
den angegebenen Faktor skaliert. Der Wert muss zwischen 0.1 und 0.9
liegen.
Die vordefinierten Parametergruppen für MGParamName
=
'default_parameters' enthalten folgende Werte:
'default_parameters' = 'very_accurate' : 'mg_solver' = 'full_multigrid' , 'mg_cycle_type' = 'w' , 'mg_pre_relax' = 5, 'mg_post_relax' = 5, 'initial_level' = -2, 'iterations' = 5, 'pyramid_factor' = 0.6.
'default_parameters' = 'accurate' : 'mg_solver' = 'full_multigrid' , 'mg_cycle_type' = 'w' , 'mg_pre_relax' = 2, 'mg_post_relax' = 2, 'initial_level' = -2, 'iterations' = 2, 'pyramid_factor' = 0.6.
'default_parameters' = 'fast_accurate' : 'mg_solver' = 'full_multigrid' , 'mg_cycle_type' = 'v' , 'mg_pre_relax' = 1, 'mg_post_relax' = 1, 'initial_level' = -2, 'iterations' = 1, 'pyramid_factor' = 0.6. Dies sind auch die Standardwerte wenn kein Parametersatz ausgewählt wird.
'default_parameters' = 'fast' : 'mg_solver' = 'full_multigrid' , 'mg_cycle_type' = 'v' , 'mg_pre_relax' = 1, 'mg_post_relax' = 1, 'initial_level' = -2, 'iterations' = 0, 'pyramid_factor' = 0.6.
Schwächen des Operators: Große Sprünge in der Disparität, welche großen Sprüngen im Abstand der beobachteten Objekte entsprechen, werden vergleichsweise stark geglättet. Dies führt insbesondere bei dünnen Objekten mit großem Abstand zum Hintergrund zu Problemen.
Am linken und rechten Rand des Bildes kann es zu Störungen kommen, da Bereiche der Szene dort nur in jeweils einem der beiden Bilder sichtbar sind.
Weiterhin sollten allgemeine Probleme bei Stereoanwendungen vermieden werden. Darunter fallen sich horizontal wiederholende Muster, schlecht texturierte Bereiche sowie Reflexionen.
ImageRect1
(input_object) singlechannelimage(-array) →
object (byte / uint2 / real)
Rektifiziertes Bild von Kamera 1.
ImageRect2
(input_object) singlechannelimage(-array) →
object (byte / uint2 / real)
Rektifiziertes Bild von Kamera 2.
Disparity
(output_object) singlechannelimage(-array) →
object (real)
Disparität.
Score
(output_object) singlechannelimage(-array) →
object (real)
Güte der berechneten Disparität wenn
CalculateScore
auf 'true'
gesetzt ist.
GrayConstancy
(input_control) real →
(real)
Gewicht der Grauwerterhaltung im Datenterm.
Defaultwert: 1.0
Wertevorschläge: 0.0, 1.0, 2.0, 10.0
Restriktion: GrayConstancy >= 0.0
GradientConstancy
(input_control) real →
(real)
Gewicht der Gradientenerhaltung im Datenterm.
Defaultwert: 30.0
Wertevorschläge: 0.0, 1.0, 5.0, 10.0, 30.0, 50.0, 70.0
Restriktion: GradientConstancy >= 0.0
Smoothness
(input_control) real →
(real)
Gewicht des Glattheitsterms bezüglich des Datenterms.
Defaultwert: 5.0
Wertevorschläge: 1.0, 3.0, 5.0, 10.0
Restriktion: Smoothness > 0.0
InitialGuess
(input_control) real →
(real)
Startwert für die Disparität.
Defaultwert: 0.0
Wertevorschläge: -30.0, -20.0, -10.0, 0.0, 10.0, 20.0, 30.0
CalculateScore
(input_control) string →
(string)
Soll die Qualitätsschätzung
in Score
zurückgegeben werden?
Defaultwert: 'false'
Wertevorschläge: 'true' , 'false'
MGParamName
(input_control) attribute.name(-array) →
(string)
Parametername(n) für das Mehrgitterverfahren.
Defaultwert: 'default_parameters'
Werteliste: 'default_parameters' , 'initial_level' , 'iterations' , 'mg_cycle_type' , 'mg_post_relax' , 'mg_pre_relax' , 'mg_solver' , 'pyramid_factor'
MGParamValue
(input_control) attribute.value(-array) →
(string / real / integer)
Parameterwert(e) für das Mehrgitterverfahren.
Defaultwert: 'fast_accurate'
Wertevorschläge: 'very_accurate' , 'accurate' , 'fast_accurate' , 'fast' , 'v' , 'w' , 'none' , 'gauss_seidel' , 'multigrid' , 'full_multigrid' , 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, -1, -2, -3, -4, -5
read_image (BaseballL, 'stereo/epipolar/baseball_l') read_image (BaseballR, 'stereo/epipolar/baseball_r') binocular_disparity_mg (BaseballL, BaseballR, Disparity, Score, \ 0.25, 30, 5, 0, 'true', \ 'default_parameters','fast_accurate')
Sind die Parameterwerte korrekt, dann liefert
binocular_disparity_mg
den Wert TRUE. Das Verhalten bei
leerer Eingabe (keine Eingabebilder vorhanden) lässt sich mittels
set_system('no_object_result',<Result>)
festlegen.
Gegebenenfalls wird eine Fehlerbehandlung durchgeführt.
threshold
,
disparity_to_distance
,
disparity_image_to_xyz
binocular_disparity
,
binocular_disparity_ms
,
binocular_distance
,
binocular_distance_mg
,
binocular_distance_ms
map_image
,
gen_binocular_rectification_map
,
binocular_calibration
3D Metrology