guided_filterguided_filterGuidedFilterGuidedFilterguided_filter (Operator)

Name

guided_filterguided_filterGuidedFilterGuidedFilterguided_filter — Guided filtering of an image.

Signature

guided_filter(Image, ImageGuide : ImageGuided : Radius, Amplitude : )

Herror guided_filter(const Hobject Image, const Hobject ImageGuide, Hobject* ImageGuided, const Hlong Radius, double Amplitude)

Herror T_guided_filter(const Hobject Image, const Hobject ImageGuide, Hobject* ImageGuided, const Htuple Radius, const Htuple Amplitude)

void GuidedFilter(const HObject& Image, const HObject& ImageGuide, HObject* ImageGuided, const HTuple& Radius, const HTuple& Amplitude)

HImage HImage::GuidedFilter(const HImage& ImageGuide, Hlong Radius, double Amplitude) const

static void HOperatorSet.GuidedFilter(HObject image, HObject imageGuide, out HObject imageGuided, HTuple radius, HTuple amplitude)

HImage HImage.GuidedFilter(HImage imageGuide, int radius, double amplitude)

def guided_filter(image: HObject, image_guide: HObject, radius: int, amplitude: float) -> HObject

Description

guided_filterguided_filterGuidedFilterGuidedFilterguided_filter filters the input ImageImageImageimageimage using the guidance image ImageGuideImageGuideImageGuideimageGuideimage_guide and returns the result in ImageGuidedImageGuidedImageGuidedimageGuidedimage_guided. ImageImageImageimageimage and ImageGuideImageGuideImageGuideimageGuideimage_guide must be of the same size and type.

The RadiusRadiusRadiusradiusradius is the size of the filter mask. Bigger values increase the area of influence of the filter and less detail is preserved. The value of RadiusRadiusRadiusradiusradius does not influence the runtime of the operator.

AmplitudeAmplitudeAmplitudeamplitudeamplitude is used to decide what is an edge and what is a homogeneous area. Bigger values of AmplitudeAmplitudeAmplitudeamplitudeamplitude lead to stronger edges being smoothed. As a rule of thumb, AmplitudeAmplitudeAmplitudeamplitudeamplitude should be lower than the contrast of the edges that should be preserved. Please note that the contrast in uint2 or real images may differ significantly from the default values of AmplitudeAmplitudeAmplitudeamplitudeamplitude and adjust the parameter accordingly.

Influence of the Guidance Image

If ImageImageImageimageimage and ImageGuideImageGuideImageGuideimageGuideimage_guide are identical, guided_filterguided_filterGuidedFilterGuidedFilterguided_filter behaves like an edge-preserving smoothing with a filter mask with RadiusRadiusRadiusradiusradius. Pixels at edges that have a contrast significantly greater than AmplitudeAmplitudeAmplitudeamplitudeamplitude are preserved, while pixels in homogeneous areas are smoothed. Hence, guided_filterguided_filterGuidedFilterGuidedFilterguided_filter is a fast alternative to anisotropic_diffusionanisotropic_diffusionAnisotropicDiffusionAnisotropicDiffusionanisotropic_diffusion or bilateral_filterbilateral_filterBilateralFilterBilateralFilterbilateral_filter.

( 1) ( 2) ( 3)

If ImageImageImageimageimage and ImageGuideImageGuideImageGuideimageGuideimage_guide are different, ImageImageImageimageimage is smoothed with a filter mask with RadiusRadiusRadiusradiusradius, except in areas where ImageGuideImageGuideImageGuideimageGuideimage_guide has edges with a contrast significantly greater than AmplitudeAmplitudeAmplitudeamplitudeamplitude.

( 1) ( 2) ( 3)

If ImageGuideImageGuideImageGuideimageGuideimage_guide is constant, guided_filterguided_filterGuidedFilterGuidedFilterguided_filter is equivalent to 2 consecutive calls of mean_imagemean_imageMeanImageMeanImagemean_image with mask size 2*RadiusRadiusRadiusradiusradius+1.

( 1) ( 2) ( 3)

Influence of the smoothing parameters

The following examples show the influence of AmplitudeAmplitudeAmplitudeamplitudeamplitude 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.

Original image with overlaid gray profile, used as ImageImageImageimageimage and ImageGuideImageGuideImageGuideimageGuideimage_guide.
Filter result with AmplitudeAmplitudeAmplitudeamplitudeamplitude = 1: No effect because AmplitudeAmplitudeAmplitudeamplitudeamplitude is below noise level. Therefore noise is treated as edge and preserved.
Filter result with AmplitudeAmplitudeAmplitudeamplitudeamplitude = 25: Noise is smoothed, edges are preserved.
Filter result with AmplitudeAmplitudeAmplitudeamplitudeamplitude = 50: The weaker edge is smoothed, the stronger edge is preserved.
Filter result with AmplitudeAmplitudeAmplitudeamplitudeamplitude = 100: Both edges are smoothed.

Rolling Guided Filter

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

In the following example, the rolling guided filter is used to separate the texture from the original image.

( 1) ( 2) ( 3)
Texture removal with the rolling guided filter: (1) Original, (2) separated structure, (3) separated texture.
* Apply the rolling guided filter
* (use a constant guide for the first iteration).
gen_image_proto(Image, ImageStructure, 0)gen_image_proto(Image, ImageStructure, 0)GenImageProto(Image, ImageStructure, 0)GenImageProto(Image, ImageStructure, 0)gen_image_proto(Image, ImageStructure, 0)
for I := 1 to 4 by 1
guided_filter(Image, ImageStructure, ImageStructure, 1.5, 60)guided_filter(Image, ImageStructure, ImageStructure, 1.5, 60)GuidedFilter(Image, ImageStructure, ImageStructure, 1.5, 60)GuidedFilter(Image, ImageStructure, ImageStructure, 1.5, 60)guided_filter(Image, ImageStructure, ImageStructure, 1.5, 60)
endfor
* Separate texture by subtracting large structures from the original.
sub_image(Image, ImageStructure, ImageTexture, 1, 128)sub_image(Image, ImageStructure, ImageTexture, 1, 128)SubImage(Image, ImageStructure, ImageTexture, 1, 128)SubImage(Image, ImageStructure, ImageTexture, 1, 128)sub_image(Image, ImageStructure, ImageTexture, 1, 128)

Since guided_filterguided_filterGuidedFilterGuidedFilterguided_filter with a constant ImageGuideImageGuideImageGuideimageGuideimage_guide is similar to mean_imagemean_imageMeanImageMeanImagemean_image, the first iteration could be replaced by a call of mean_imagemean_imageMeanImageMeanImagemean_image (or a similar smoothing filter), which is faster.

Mathematical Background

The calculation of the filtered gray value at the position is done according to the following formula: where and where and are the gray values of ImageImageImageimageimage and ImageGuideImageGuideImageGuideimageGuideimage_guide at the pixel position , is the neighborhood with radius RadiusRadiusRadiusradiusradius around the pixel , , , , and are the mean of all , , , or in , is the standard deviation of all gray values of in , and is the number of pixels in .

For an explanation of the concept of smoothing filters see the introduction of chapter Filters / Smoothing.

Execution Information

Parameters

ImageImageImageimageimage (input_object)  (multichannel-)image(-array) objectHImageHObjectHObjectHobject (byte / uint2 / real)

Input image.

ImageGuideImageGuideImageGuideimageGuideimage_guide (input_object)  (multichannel-)image(-array) objectHImageHObjectHObjectHobject (byte / uint2 / real)

Guidance image.

ImageGuidedImageGuidedImageGuidedimageGuidedimage_guided (output_object)  (multichannel-)image(-array) objectHImageHObjectHObjectHobject * (byte / uint2 / real)

Output image.

RadiusRadiusRadiusradiusradius (input_control)  integer HTupleintHTupleHtuple (integer) (int / long) (Hlong) (Hlong)

Radius of the filtering operation.

Default: 3

Suggested values: 1, 2, 3, 5, 10

Restriction: Radius > 0

AmplitudeAmplitudeAmplitudeamplitudeamplitude (input_control)  real HTuplefloatHTupleHtuple (real) (double) (double) (double)

Controls the influence of edges on the smoothing.

Default: 20.0

Suggested values: 3.0, 10.0, 20.0, 50.0, 100.0

Restriction: Amplitude > 0

Example (HDevelop)

read_image (Image, 'mreut')
* Edge-preserving smoothing
guided_filter (Image, Image, ImageGuided, 5, 20)
* Rolling filter (5 iterations)
gen_image_proto (Image, ImageGuide, 0)
for I := 1 to 5 by 1
  guided_filter (Image, ImageGuide, ImageGuide, 5, 20)
endfor

Possible Predecessors

read_imageread_imageReadImageReadImageread_image

Possible Successors

thresholdthresholdThresholdThresholdthreshold, dyn_thresholddyn_thresholdDynThresholdDynThresholddyn_threshold, regiongrowingregiongrowingRegiongrowingRegiongrowingregiongrowing

Alternatives

bilateral_filterbilateral_filterBilateralFilterBilateralFilterbilateral_filter, anisotropic_diffusionanisotropic_diffusionAnisotropicDiffusionAnisotropicDiffusionanisotropic_diffusion, median_imagemedian_imageMedianImageMedianImagemedian_image

References

Kaiming He, Jian Sun, Xiaoou Tang: “Guided Image Filtering”; IEEE Transactions on Pattern Analysis and Machine Intelligence; PAMI-35, no. 6; S. 1397-1409; 2013.

Module

Foundation