KlassenKlassenKlassenKlassen | | | | Operatoren

bilateral_filterbilateral_filterBilateralFilterbilateral_filterBilateralFilterBilateralFilter (Operator)

Name

bilateral_filterbilateral_filterBilateralFilterbilateral_filterBilateralFilterBilateralFilter — Bilaterale Filterung eines Bildes.

Signatur

bilateral_filter(Image, ImageJoint : ImageBilateral : SigmaSpatial, SigmaRange, GenParamName, GenParamValue : )

Herror bilateral_filter(const Hobject Image, const Hobject ImageJoint, Hobject* ImageBilateral, double SigmaSpatial, double SigmaRange, const char* GenParamName, double GenParamValue)

Herror T_bilateral_filter(const Hobject Image, const Hobject ImageJoint, Hobject* ImageBilateral, const Htuple SigmaSpatial, const Htuple SigmaRange, const Htuple GenParamName, const Htuple GenParamValue)

Herror bilateral_filter(Hobject Image, Hobject ImageJoint, Hobject* ImageBilateral, const HTuple& SigmaSpatial, const HTuple& SigmaRange, const HTuple& GenParamName, const HTuple& GenParamValue)

HImage HImage::BilateralFilter(const HImage& ImageJoint, const HTuple& SigmaSpatial, const HTuple& SigmaRange, const HTuple& GenParamName, const HTuple& GenParamValue) const

HImageArray HImageArray::BilateralFilter(const HImageArray& ImageJoint, const HTuple& SigmaSpatial, const HTuple& SigmaRange, const HTuple& GenParamName, const HTuple& GenParamValue) const

void BilateralFilter(const HObject& Image, const HObject& ImageJoint, HObject* ImageBilateral, const HTuple& SigmaSpatial, const HTuple& SigmaRange, const HTuple& GenParamName, const HTuple& GenParamValue)

HImage HImage::BilateralFilter(const HImage& ImageJoint, double SigmaSpatial, double SigmaRange, const HTuple& GenParamName, const HTuple& GenParamValue) const

HImage HImage::BilateralFilter(const HImage& ImageJoint, double SigmaSpatial, double SigmaRange, const HString& GenParamName, double GenParamValue) const

HImage HImage::BilateralFilter(const HImage& ImageJoint, double SigmaSpatial, double SigmaRange, const char* GenParamName, double GenParamValue) const

void HOperatorSetX.BilateralFilter(
[in] IHUntypedObjectX* Image, [in] IHUntypedObjectX* ImageJoint, [out] IHUntypedObjectX*ImageBilateral, [in] VARIANT SigmaSpatial, [in] VARIANT SigmaRange, [in] VARIANT GenParamName, [in] VARIANT GenParamValue)

IHImageX* HImageX.BilateralFilter(
[in] IHImageX* ImageJoint, [in] double SigmaSpatial, [in] double SigmaRange, [in] VARIANT GenParamName, [in] VARIANT GenParamValue)

static void HOperatorSet.BilateralFilter(HObject image, HObject imageJoint, out HObject imageBilateral, HTuple sigmaSpatial, HTuple sigmaRange, HTuple genParamName, HTuple genParamValue)

HImage HImage.BilateralFilter(HImage imageJoint, double sigmaSpatial, double sigmaRange, HTuple genParamName, HTuple genParamValue)

HImage HImage.BilateralFilter(HImage imageJoint, double sigmaSpatial, double sigmaRange, string genParamName, double genParamValue)

Beschreibung

bilateral_filterbilateral_filterBilateralFilterbilateral_filterBilateralFilterBilateralFilter führt eine gemeinsame bilaterale Filterung des Eingabebildes ImageImageImageImageImageimage und des Führungsbildes ImageJointImageJointImageJointImageJointImageJointimageJoint durch und liefert das Ergebnis in ImageBilateralImageBilateralImageBilateralImageBilateralImageBilateralimageBilateral zurück. ImageImageImageImageImageimage und ImageJointImageJointImageJointImageJointImageJointimageJoint müssen dieselbe Größe haben und vom gleichen Typ sein.

SigmaSpatialSigmaSpatialSigmaSpatialSigmaSpatialSigmaSpatialsigmaSpatial 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.

SigmaRangeSigmaRangeSigmaRangeSigmaRangeSigmaRangesigmaRange wird verwendet, um die Filtermaske abhängig vom Inhalt von ImageJointImageJointImageJointImageJointImageJointimageJoint um das aktuelle Pixel zu verändern. Nur Pixel in Bereichen mit schwachen Kanten, die einen niedrigeren Kontrast als SigmaRangeSigmaRangeSigmaRangeSigmaRangeSigmaRangesigmaRange haben, beeinflussen die Glättung. Es ist zu beachten, dass der Kontrast in uint2- oder real-Bildern deutlich vom Defaultwert von SigmaRangeSigmaRangeSigmaRangeSigmaRangeSigmaRangesigmaRange abweichen kann und der Parameter daher gesondert eingestellt werden muss.

GenParamNameGenParamNameGenParamNameGenParamNameGenParamNamegenParamName und GenParamValueGenParamValueGenParamValueGenParamValueGenParamValuegenParamValue können zurzeit verwendet werden, um den Trade-off zwischen Geschwindigkeit und Genauigkeit zu steuern (siehe unten).

Einfluss des Führungsbildes

Jedes Pixel von ImageImageImageImageImageimage wird mit einer Filtermaske, die von ImageJointImageJointImageJointImageJointImageJointimageJoint abhängt, gefiltert. Die Filtermaske kombiniert eine Gauss'sche Nähefunktion, die von SigmaSpatialSigmaSpatialSigmaSpatialSigmaSpatialSigmaSpatialsigmaSpatial abhängt, und eine Gauss'sche Ähnlichkeitsfunktion, die Grauwertunterschiede abhängig von SigmaRangeSigmaRangeSigmaRangeSigmaRangeSigmaRangesigmaRange gewichtet.

Beispiele von lokalen Filtermasken abhängig von ImageJointImageJointImageJointImageJointImageJointimageJoint: Links: In homogenen Bereichen entspricht die Filtermaske einer Gaussglocke. 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 ImageImageImageImageImageimage und ImageJointImageJointImageJointImageJointImageJointimageJoint identisch, verhält sich bilateral_filterbilateral_filterBilateralFilterbilateral_filterBilateralFilterBilateralFilter wie ein kantenerhaltender Glättungsfilter, dessen Maskengröße von SigmaSpatialSigmaSpatialSigmaSpatialSigmaSpatialSigmaSpatialsigmaSpatial bestimmt wird. Pixel an Kanten mit einem Kontrast, der deutlich über SigmaRangeSigmaRangeSigmaRangeSigmaRangeSigmaRangesigmaRange liegt, werden erhalten, während Pixel in homogenen Bereichen geglättet werden.

(1) (2) (3)
(1) ImageImageImageImageImageimage und (2) ImageJointImageJointImageJointImageJointImageJointimageJoint sind identisch. Das führt zu kantenerhaltender Glättung in (3) ImageBilateralImageBilateralImageBilateralImageBilateralImageBilateralimageBilateral.

Sind ImageImageImageImageImageimage und ImageJointImageJointImageJointImageJointImageJointimageJoint verschieden, wird jeder Pixel von ImageImageImageImageImageimage mit einer Filtermaske geglättet, die von ImageJointImageJointImageJointImageJointImageJointimageJoint beeinflusst wird. Pixel and Positionen, wo ImageJointImageJointImageJointImageJointImageJointimageJoint starke Kanten aufweist, deren Kontrast deutlich über SigmaRangeSigmaRangeSigmaRangeSigmaRangeSigmaRangesigmaRange liegt, werden weniger geglättet als Pixel in homogenen Bereichen.

(1) (2) (3)
(1) ImageImageImageImageImageimage und (2) ImageJointImageJointImageJointImageJointImageJointimageJoint sind verschieden. Nur Kanten in Bereichen, wo ImageJointImageJointImageJointImageJointImageJointimageJoint Kanten hat, bleiben in (3) ImageBilateralImageBilateralImageBilateralImageBilateralImageBilateralimageBilateral erhalten.

Ist ImageJointImageJointImageJointImageJointImageJointimageJoint konstant, verhält sich bilateral_filterbilateral_filterBilateralFilterbilateral_filterBilateralFilterBilateralFilter äquivalent zu einer Gauss-Glättung mit SigmaSpatialSigmaSpatialSigmaSpatialSigmaSpatialSigmaSpatialsigmaSpatial (siehe gauss_filtergauss_filterGaussFiltergauss_filterGaussFilterGaussFilter oder smooth_imagesmooth_imageSmoothImagesmooth_imageSmoothImageSmoothImage).

(1) (2) (3)
(2) ImageJointImageJointImageJointImageJointImageJointimageJoint ist konstant. Das entspricht einer Gauss-Glättung von (1) ImageImageImageImageImageimage. (3) ImageBilateralImageBilateralImageBilateralImageBilateralImageBilateralimageBilateral.

Einfluss der Glättungsparameter

Die folgenden Beispiele zeigen den Einfluss von SigmaRangeSigmaRangeSigmaRangeSigmaRangeSigmaRangesigmaRange 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.

Originalbild mit überlagertem Grauwertprofil. Das Bild wird sowohl für ImageImageImageImageImageimage als auch für ImageJointImageJointImageJointImageJointImageJointimageJoint verwendet.
Filterergebnis mit SigmaRangeSigmaRangeSigmaRangeSigmaRangeSigmaRangesigmaRange = 1: Kein Effekt, da SigmaRangeSigmaRangeSigmaRangeSigmaRangeSigmaRangesigmaRange unter dem Rauschlevel liegt. Daher wird das Rauschen als Kante behandelt und erhalten.
Filterergebnis mit SigmaRangeSigmaRangeSigmaRangeSigmaRangeSigmaRangesigmaRange = 25: Das Rauschen wird geglättet, die Kanten bleiben erhalten.
Filterergebnis mit SigmaRangeSigmaRangeSigmaRangeSigmaRangeSigmaRangesigmaRange = 50: Die schwächere Kante wird geglättet, die stärkere Kante bleibt erhalten.
Filterergebnis mit SigmaRangeSigmaRangeSigmaRangeSigmaRangeSigmaRangesigmaRange = 100: Beide Kanten werden geglättet.

Generische Parameter

Die folgenden Werte für GenParamNameGenParamNameGenParamNameGenParamNameGenParamNamegenParamName werden unterstützt:

'sampling_method'"sampling_method""sampling_method""sampling_method""sampling_method""sampling_method"

Per Default verwendet bilateral_filterbilateral_filterBilateralFilterbilateral_filterBilateralFilterBilateralFilter einen Nährungsalgorithmus, der nur eine Teilmenge von abgetasteten Punkten für die Berechnung der lokalen Filtermasken verwendet.

Mit 'sampling_method'"sampling_method""sampling_method""sampling_method""sampling_method""sampling_method" kann die verwendete Abtastmethode ausgewählt werden. Mögliche Werte sind:

'grid'"grid""grid""grid""grid""grid" (Default)

Verwendet ein reguläres Gitter zur Abtastung der Filtermasken.

'poisson_disk'"poisson_disk""poisson_disk""poisson_disk""poisson_disk""poisson_disk"

Verwendet eine Poisson-Disk-Abtastung. Diese Methode ist langsamer als 'grid'"grid""grid""grid""grid""grid", möglicherweise liefert sie aber weniger Artefakte.

'exact'"exact""exact""exact""exact""exact"

Verwendet alle verfügbaren Punkte. Diese Methode ist die genaueste, aber auch die langsamste. Falls 'exact'"exact""exact""exact""exact""exact" verwendet wird, wird 'sampling_ratio'"sampling_ratio""sampling_ratio""sampling_ratio""sampling_ratio""sampling_ratio" ignoriert.

'sampling_ratio'"sampling_ratio""sampling_ratio""sampling_ratio""sampling_ratio""sampling_ratio"

Steuert, wie viele Punkte für die Abtastung verwendet werden.

Durch Setzen von 'sampling_ratio'"sampling_ratio""sampling_ratio""sampling_ratio""sampling_ratio""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

Rolling-Bilateral-Filter

bilateral_filterbilateral_filterBilateralFilterbilateral_filterBilateralFilterBilateralFilter 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: ImageJointImageJointImageJointImageJointImageJointimageJoint konstant, SigmaSpatialSigmaSpatialSigmaSpatialSigmaSpatialSigmaSpatialsigmaSpatial = 25, SigmaRangeSigmaRangeSigmaRangeSigmaRangeSigmaRangesigmaRange = 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)
(1) Eingabebild ImageImageImageImageImageimage und (2) ImageJointImageJointImageJointImageJointImageJointimageJoint für die erste Iteration des Rolling-Filters.

Ergebnis nach der ersten Iteration: Der schmalere Streifen ist verschwunden.

Ergebnis nach der dritten Iteration: Die Kanten des rechten Streifens sind teilweise wiederhergestellt.

Ergebnis nach der sechsten Iteration: Die Kanten des rechten Streifens sind komplett wiederhergestellt.

Mathematischer Hintergrund

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 ImageBilateralImageBilateralImageBilateralImageBilateralImageBilateralimageBilateral, ImageImageImageImageImageimage und ImageJointImageJointImageJointImageJointImageJointimageJoint an der Pixelposition . ist die Umgebung um den Pixel .

Parallelisierung

Parameter

ImageImageImageImageImageimage (input_object)  (multichannel-)image(-array) objectHImageHImageHImageHImageXHobject (byte / uint2 / real)

Zu filterndes Bild.

ImageJointImageJointImageJointImageJointImageJointimageJoint (input_object)  (multichannel-)image(-array) objectHImageHImageHImageHImageXHobject (byte / uint2 / real)

Führungsbild.

ImageBilateralImageBilateralImageBilateralImageBilateralImageBilateralimageBilateral (output_object)  (multichannel-)image(-array) objectHImageHImageHImageHImageXHobject * (byte / uint2 / real)

Gefiltertes Ausgabebild.

SigmaSpatialSigmaSpatialSigmaSpatialSigmaSpatialSigmaSpatialsigmaSpatial (input_control)  real HTupleHTupleHTupleVARIANTHtuple (real) (double) (double) (double) (double) (double)

Größe der Gaussglocke der Nähefunktion.

Defaultwert: 3.0

Wertevorschläge: 1.0, 2.0, 3.0, 10.0

Restriktion: SigmaSpatial > 0.6

SigmaRangeSigmaRangeSigmaRangeSigmaRangeSigmaRangesigmaRange (input_control)  real HTupleHTupleHTupleVARIANTHtuple (real) (double) (double) (double) (double) (double)

Größe der Gaussglocke der Ähnlichkeitsfunktion.

Defaultwert: 20.0

Wertevorschläge: 3.0, 10.0, 20.0, 50.0, 100.0

Restriktion: SigmaRange > 0.0001

GenParamNameGenParamNameGenParamNameGenParamNameGenParamNamegenParamName (input_control)  attribute.name(-array) HTupleHTupleHTupleVARIANTHtuple (string) (string) (HString) (char*) (BSTR) (char*)

Namen der generischen Parameter.

Defaultwert: []

Werteliste: 'sampling_method'"sampling_method""sampling_method""sampling_method""sampling_method""sampling_method", 'sampling_ratio'"sampling_ratio""sampling_ratio""sampling_ratio""sampling_ratio""sampling_ratio"

GenParamValueGenParamValueGenParamValueGenParamValueGenParamValuegenParamValue (input_control)  attribute.value(-array) HTupleHTupleHTupleVARIANTHtuple (real / integer / string) (double / int / long / string) (double / Hlong / HString) (double / Hlong / char*) (double / Hlong / BSTR) (double / Hlong / char*)

Werte der generischen Parameter.

Defaultwert: []

Wertevorschläge: 'grid'"grid""grid""grid""grid""grid", 'poisson_disk'"poisson_disk""poisson_disk""poisson_disk""poisson_disk""poisson_disk", 'exact'"exact""exact""exact""exact""exact", 0.5, 0.25, 0.75, 1.0

Beispiel (HDevelop)

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

Vorgänger

read_imageread_imageReadImageread_imageReadImageReadImage

Nachfolger

thresholdthresholdThresholdthresholdThresholdThreshold, dyn_thresholddyn_thresholdDynThresholddyn_thresholdDynThresholdDynThreshold, var_thresholdvar_thresholdVarThresholdvar_thresholdVarThresholdVarThreshold, regiongrowingregiongrowingRegiongrowingregiongrowingRegiongrowingRegiongrowing

Alternativen

guided_filterguided_filterGuidedFilterguided_filterGuidedFilterGuidedFilter, anisotropic_diffusionanisotropic_diffusionAnisotropicDiffusionanisotropic_diffusionAnisotropicDiffusionAnisotropicDiffusion, median_imagemedian_imageMedianImagemedian_imageMedianImageMedianImage

Literatur

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.

Modul

Foundation


KlassenKlassenKlassenKlassen | | | | Operatoren