Skip to content
Fast and complete guided filter implementation for OpenCV
C++
Branch: master
Clone or download

Latest commit

Fetching latest commit…
Cannot retrieve the latest commit at this time.

Files

Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.gitignore Initial commit Dec 19, 2014
LICENSE Initial commit Dec 19, 2014
README.md Updated readme. Dec 22, 2014
guidedfilter.cpp Initial commit Dec 20, 2014
guidedfilter.h Initial commit Dec 20, 2014

README.md

Guided filter for OpenCV

Guided filter is an edge-preserving smoothing filter like the bilateral filter. It is straightforward to implement and has linear complexity independent of the kernel size. For more details about this filter see [Kaiming10].

Usage

The interface consists of one simple function guidedFilter and a class GuidedFilter. If you have multiple images to filter with the same guidance image then use GuidedFilter class to avoid extra computations on initialization stage. The code supports single-channel and 3-channel (color) guidance images and CV_8U, CV_8S, CV_16U, CV_16S, CV_32S, CV_32F and CV_64F data types.

Examples

These examples are adapted from the original MATLAB implementation.

Smoothing

cv::Mat I = cv::imread("./img_smoothing/cat.bmp", CV_LOAD_IMAGE_GRAYSCALE);
cv::Mat p = I;

int r = 4; // try r=2, 4, or 8
double eps = 0.2 * 0.2; // try eps=0.1^2, 0.2^2, 0.4^2

eps *= 255 * 255;   // Because the intensity range of our images is [0, 255]

cv::Mat q = guidedFilter(I, p, r, eps);

Cat

r=2, eps=0.1^2 r=2, eps=0.2^2 r=2, eps=0.4^2

r=4, eps=0.1^2 r=4, eps=0.2^2 r=4, eps=0.4^2

r=8, eps=0.1^2 r=8, eps=0.2^2 r=8, eps=0.4^2

Flash/no-flash denoising

cv::Mat I = cv::imread("./img_flash/cave-flash.bmp", CV_LOAD_IMAGE_COLOR);
cv::Mat p = cv::imread("./img_flash/cave-noflash.bmp", CV_LOAD_IMAGE_COLOR);

int r = 8;
double eps = 0.02 * 0.02;

eps *= 255 * 255;   // Because the intensity range of our images is [0, 255]

cv::Mat q = guidedFilter(I, p, r, eps);

Cave Flash Cave No Flash Cave Denoised

Feathering

cv::Mat I = cv::imread("./img_feathering/toy.bmp", CV_LOAD_IMAGE_COLOR);
cv::Mat p = cv::imread("./img_feathering/toy-mask.bmp", CV_LOAD_IMAGE_GRAYSCALE);

int r = 60;
double eps = 1e-6;

eps *= 255 * 255;   // Because the intensity range of our images is [0, 255]

cv::Mat q = guidedFilter(I, p, r, eps);

Mask Guidance Feathering

Enhancement

cv::Mat I = cv::imread("./img_enhancement/tulips.bmp", CV_LOAD_IMAGE_COLOR);
I.convertTo(I, CV_32F, 1.0 / 255.0);

cv::Mat p = I;

int r = 16;
double eps = 0.1 * 0.1;

cv::Mat q = guidedFilter(I, p, r, eps);

cv::Mat I_enhanced = (I - q) * 5 + q;

Tulip Smoothed Enhanced

License

MIT license.

You can’t perform that action at this time.