bilateral_filter — Bilaterale Filterung eines Bildes.
bilateral_filter(Image, ImageJoint : ImageBilateral : SigmaSpatial, SigmaRange, GenParamName, GenParamValue : )
bilateral_filter führt eine gemeinsame bilaterale Filterung
des Eingabebildes Image und des Führungsbildes ImageJoint
durch und liefert das Ergebnis in ImageBilateral zurück.
Image und ImageJoint müssen dieselbe Größe haben und vom
gleichen Typ sein.
SigmaSpatial definiert die Größe der Filtermaske und korrespondiert
mit der Standardabweichung eines gewöhnlichen Gaussfilters.
Größere Werte erhöhen den Einflussbereich des Filters und führen dazu,
dass weniger Details erhalten bleiben.
SigmaRange wird verwendet, um die Filtermaske abhängig vom Inhalt
von ImageJoint um das aktuelle Pixel zu verändern.
Nur Pixel in Bereichen mit schwachen Kanten, die einen niedrigeren Kontrast
als SigmaRange haben, beeinflussen die Glättung.
Es ist zu beachten, dass der Kontrast in uint2- oder real-Bildern deutlich
vom Defaultwert von SigmaRange abweichen kann und der Parameter
daher gesondert eingestellt werden muss.
GenParamName und GenParamValue können zurzeit verwendet
werden, um den Trade-off zwischen Geschwindigkeit und Genauigkeit zu
steuern (siehe unten).
Jedes Pixel von Image wird mit einer Filtermaske, die von
ImageJoint abhängt, gefiltert. Die Filtermaske kombiniert eine
Gauss'sche Nähefunktion, die von SigmaSpatial abhängt, und eine
Gauss'sche Ähnlichkeitsfunktion, die Grauwertunterschiede abhängig von
SigmaRange gewichtet.
ImageJoint:
Links: In homogenen Bereichen entspricht die Filtermaske einer
Gaußglocke.
Mitte: Die Filtermaske passt sich der Linie an. Das heißt, nur dunkle
Pixel werden geglättet, die Kanten bleiben erhalten.
Rechts: Die Filtermaske ähnelt der Ecke. Man beachte, dass sie über den
Schatten in Bereiche mit ähnlichen Grauwerten hineinragt.
Sind Image und ImageJoint identisch, verhält sich
bilateral_filter wie ein kantenerhaltender Glättungsfilter, dessen
Maskengröße von SigmaSpatial bestimmt wird.
Pixel an Kanten mit einem Kontrast, der deutlich über SigmaRange
liegt, werden erhalten, während Pixel in homogenen Bereichen geglättet
werden.
| (1) | (2) | (3) |
Image und (2) ImageJoint sind identisch.
Das führt zu kantenerhaltender Glättung in (3) ImageBilateral.
Sind Image und ImageJoint verschieden, wird jeder Pixel
von Image mit einer Filtermaske geglättet, die von
ImageJoint beeinflusst wird. Pixel und Positionen, wo
ImageJoint starke Kanten aufweist, deren Kontrast deutlich über
SigmaRange liegt, werden weniger geglättet als Pixel in homogenen
Bereichen.
| (1) | (2) | (3) |
Image und (2) ImageJoint sind verschieden.
Nur Kanten in Bereichen, wo ImageJoint Kanten hat, bleiben in
(3) ImageBilateral erhalten.
Ist ImageJoint konstant, verhält sich bilateral_filter
äquivalent zu einer Gauss-Glättung mit SigmaSpatial (siehe
gauss_filter oder smooth_image).
| (1) | (2) | (3) |
Die folgenden Beispiele zeigen den Einfluss von SigmaRange auf
einem künstlichen Bild. In diesem Bild liegt das Rauschlevel bei 10
Grauwerten, die linke Kante hat einen Kontrast von 50 Grauwerten,
die rechte Kante hat einen Kontrast von 100 Grauwerten.
Die gelbe Linie zeigt das Grauwertprofil eines horizontalen Querschnitts.
Image als auch für ImageJoint verwendet.
SigmaRange = 1:
Kein Effekt, da SigmaRange unter dem Rauschlevel liegt. Daher
wird das Rauschen als Kante behandelt und erhalten.
SigmaRange = 25:
Das Rauschen wird geglättet, die Kanten bleiben erhalten.
SigmaRange = 50:
Die schwächere Kante wird geglättet, die stärkere Kante bleibt erhalten.
SigmaRange = 100: Beide Kanten werden
geglättet.
Die folgenden Werte für GenParamName werden unterstützt:
Per Default verwendet
bilateral_filter einen Näherungsalgorithmus, der nur eine
Teilmenge von abgetasteten Punkten für die Berechnung der lokalen
Filtermasken verwendet.
Mit 'sampling_method' kann die verwendete Abtastmethode ausgewählt werden. Mögliche Werte sind:
Verwendet ein reguläres Gitter zur Abtastung der Filtermasken.
Verwendet eine Poisson-Disk-Abtastung. Diese Methode ist langsamer als 'grid', möglicherweise liefert sie aber weniger Artefakte.
Verwendet alle verfügbaren Punkte. Diese Methode ist die genaueste, aber auch die langsamste. Falls 'exact' verwendet wird, wird 'sampling_ratio' ignoriert.
Steuert, wie viele Punkte für die Abtastung verwendet werden.
Durch Setzen von 'sampling_ratio' auf 1.0 wird die exakte Methode verwendet. Eine niedrigere Abtastrate führt zu einer schnelleren Filterung, aber auch zu etwas ungenaueren Ergebnissen.
Empfohlene Werte: 0.25, 0.5, 0.75, 1.0
Default: 0.50
bilateral_filter kann iterativ aufgerufen werden. In dem Fall wird
das Ergebnis einer Iteration als Führungsbild der nächsten Iteration
verwendet. Das kann nützlich sein, z.B. um kleine Strukturen aus dem
Originalbild zu entfernen, auch wenn sie einen hohen Kontrast haben.
Das folgende Beispiel zeigt den Effekt des Rolling-Filters anhand eines künstlichen Beispielbildes. In diesem Bild liegt das Rauschlevel bei 10 Grauwerten, der Kontrast zwischen dunklen und hellen Bereichen beträgt 100 Grauwerte. Der linke helle Streifen ist 10 Pixel breit, der rechte Streifen 40 Pixel. Die gelbe Linie zeigt das Grauwertprofil eines horizontalen Querschnitts.
Verwendete Parameter:ImageJoint konstant,
SigmaSpatial = 25, SigmaRange = 15.
* Verwenden des Rolling-Bilateral-Filter
|
* (verwende ein konstantes Führungsbild für die erste Iteration).
|
gen_image_proto(Image, ImageJoint, 128)
|
for I := 1 to 6 by 1
|
bilateral_filter(Image, ImageJoint, ImageJoint, 25, 15, [], [])
|
endfor
|
| (1) | (2) |
Image und (2) ImageJoint für die erste
Iteration des Rolling-Filters.
Die Berechnung der gefilterten Grauwerte beruht auf folgender Formel:
Dabei ist die Nähefunktion (closeness function)
und die Ähnlichkeitsfunktion (similarity function)
ist ein Normalisierungsfaktor
, und sind die Grauwerte
von ImageBilateral, Image und ImageJoint an der
Pixelposition .
ist die Umgebung um den Pixel .
Das Konzept der Glättungsfilter ist in der Einleitung zum Kapitel Filter / Glättung beschrieben.
Image (input_object) (multichannel-)image(-array) → object (byte / uint2 / real)
Zu filterndes Bild.
ImageJoint (input_object) (multichannel-)image(-array) → object (byte / uint2 / real)
Führungsbild.
ImageBilateral (output_object) (multichannel-)image(-array) → object (byte / uint2 / real)
Gefiltertes Ausgabebild.
SigmaSpatial (input_control) real → (real)
Größe der Gaußglocke der Nähefunktion.
Defaultwert: 3.0
Wertevorschläge: 1.0, 2.0, 3.0, 10.0
Restriktion: SigmaSpatial > 0.6
SigmaRange (input_control) real → (real)
Größe der Gaußglocke der Ähnlichkeitsfunktion.
Defaultwert: 20.0
Wertevorschläge: 3.0, 10.0, 20.0, 50.0, 100.0
Restriktion: SigmaRange > 0.0001
GenParamName (input_control) attribute.name(-array) → (string)
Namen der generischen Parameter.
Defaultwert: []
Werteliste: 'sampling_method', 'sampling_ratio'
GenParamValue (input_control) attribute.value(-array) → (real / integer / string)
Werte der generischen Parameter.
Defaultwert: []
Wertevorschläge: 'grid', 'poisson_disk', 'exact', 0.5, 0.25, 0.75, 1.0
read_image (Image, 'mreut') * Edge-preserving smoothing bilateral_filter (Image, Image, ImageBilateral, 5, 20, [], []) * Rolling filter (5 iterations) gen_image_proto (Image, ImageJoint, 0) for I := 1 to 5 by 1 bilateral_filter (Image, ImageJoint, ImageJoint, 5, 20, [], []) endfor
threshold,
dyn_threshold,
var_threshold,
regiongrowing
guided_filter,
anisotropic_diffusion,
median_image
C. Tomasi, R. Manduchi: “Bilateral filtering for gray and color images“;
Sixth International Conference in Computer Vision;
S. 839-846; January 1998.
F. Banterle, M. Corsini, P. Cignoni, R. Scopigno: “A Low-Memory,
Straightforward and Fast Bilateral Filter Through Subsampling in
Spatial Domain“;
Computer Graphics Forum, no. 1, vol 31;
S. 19-23; February 2012.
G. Petschnigg, R. Szeliski, M. Agrawala, M. Cohen, H. Hoppe, K. Toyama:
“Digital Photography with Flash and No-flash Image Pairs“;
ACM Trans., no. 3, vol. 23;
S. 9; August 2004.
R. Bridson: “Fast Poisson Disk Sampling in Arbitrary Dimensions“;
ACM SIGGRAPH 2007 Sketches, no. 22;
2007.
Foundation