bilateral_filter — bilateral filtering of an image.
bilateral_filter performs a joint bilateral filtering on the input Image using the guidance image ImageJoint and returns the result in ImageBilateral. Image and ImageJoint must be of the same size and type.
SigmaSpatial defines the size of the filter mask and corresponds to the standard deviation of a conventional gauss filter. Bigger values increase the area of influence of the filter and less detail is preserved.
SigmaRange is used to modify the filter mask depending on the pixels of ImageJoint around the current pixel. Only pixels in areas with weak edges that have a contrast lower than SigmaRange contribute to the smoothing. Please note that the contrast in uint2 or real images may differ significantly from the default values of SigmaRange and adjust the parameter accordingly.
GenParamName and GenParamValue currently can be used to control the trade-off between accuracy and speed (see below).
Each pixel of Image is filtered with a filter mask that depends on ImageJoint. The filter mask combines a Gaussian closeness function depending on SigmaSpatial and a Gaussian similarity function that weights gray value differences depending on SigmaRange.
If Image and ImageJoint are identical, bilateral_filter behaves like an edge-preserving smoothing where SigmaSpatial defines the size of the filter mask. Pixels at edges that have a contrast significantly greater than SigmaRange are preserved, while pixels in homogeneous areas are smoothed.
If Image and ImageJoint are different, each pixel of Image is smoothed with a filter mask that is influenced by ImageJoint. Pixels at positions where ImageJoint has strong edges with a contrast significantly greater than SigmaRange are smoothed less than pixels in homogeneous areas.
If ImageJoint is constant, bilateral_filter is equivalent to a Gaussian smoothing with SigmaSpatial (see gauss_filter or smooth_image).
The following examples show the influence of SigmaRange on an artificial image. In this image, the noise level is 10 gray values, the left edge has a contrast of 50 gray values, the right edge has a contrast of 100 gray values. The yellow line shows a gray-value profile of a horizontal cross section.
The following values for GenParamName are supported:
Per default, bilateral_filter uses an approximation of the bilateral filter that only uses a subset of sampled points for the calculation of the local filter masks.
By setting 'sampling_method', the used approximation can be selected. Possible values are:
Uses a regular grid for subsampling the filter masks.
Uses a Poisson disk sampling. This method is slower than 'grid', but may produce less artifacts.
Uses all available points. This method is slowest, but the most accurate. If 'exact' is used, 'sampling_ratio' is ignored.
Controls how many points are used for the subsampling of the local filter masks.
By setting 'sampling_ratio' to 1.0, the exact method is used. Using a lower sampling ratio leads to faster filtering, but also to slightly less accurate results.
Suggested values: 0.25, 0.5, 0.75, 1.0
bilateral_filter can be applied iteratively. In this case, the result of one iteration is used as guidance image for the next iteration. This can be useful, e.g., to remove small structures from the original image even if they have a high contrast.
The following example shows the effect of a rolling filter on an artificial image. In this image, the noise level is 10 gray values, the contrast between dark and bright areas is 100 gray values, the left bright bar is 10 pixels wide, the right bar is 40 pixels wide. The yellow line shows a gray-value profile of a horizontal cross section. Used parameters: ImageJoint constant, SigmaSpatial = 25, SigmaRange = 15.
* Apply the rolling bilateral filter * (use a constant guide for the first iteration). gen_image_proto (Image, ImageJoint, 128) for I := 1 to 6 by 1 bilateral_filter (Image, ImageJoint, ImageJoint, 25, 15, , ) endfor
The calculation of the filtered gray values is done on the basis of the following formula:
Image to be filtered.
Filtered output image.
Size of the Gaussian of the closeness function.
Default value: 3.0
Suggested values: 1.0, 2.0, 3.0, 10.0
Restriction: SigmaSpatial > 0.6
Size of the Gaussian of the similarity function.
Default value: 20.0
Suggested values: 3.0, 10.0, 20.0, 50.0, 100.0
Restriction: SigmaRange > 0.0001
Generic parameter name.
Default value: 
List of values: 'sampling_method', 'sampling_ratio'
Generic parameter value.
Default value: 
Suggested values: '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.