Bilateral filtering was proposed by Tomasi and Manduchi in 1998 as a non-iterative method for edge-preserving smoothing. For a complete description see the following publication:
C. Tomasi and R. Manduchi. Bilateral Filtering for Gray and Color Images. In Proceedings of the IEEE International Conference on Computer Vision, 1998.
This package contains a basic implementation (bfilter2.m) of their method for both grayscale and color images. In order to demonstrate the utility of bilateral filtering, the main function is used to implement an automatic image abstraction routine (cartoon.m) inspired by:
Holger Winnemoller, Sven C. Olsen, and Bruce Gooch. Real-Time Video Abstraction. In Proceedings of ACM SIGGRAPH, 2006.
A demonstration program (runDemo.m) summarizes the typical use of all included files.
First of all, thank you for the code but, while using with mat lab 6.1 , i am getting errors
??? Error: File: C:\bfilter2\Bilateral Filtering\bfilter2.m Line: 30 Column: 23
Expected a variable, function, or constant, found "|".
Error in ==> C:\bfilter2\Bilateral Filtering\runDemo.m
On line 30 ==> bflt_img1 = bfilter2(img1,w,sigma);
Hello, thank for codes [which works nicely both in gray-level and color image]
Mr Douglas Lanman or Mr. Joseph Shtok,
I have understood the bilateral filter over 2D dimension / an image.by considering Kernel which is a 2D square .
I have question. I'm apply bilateral filter over a sequence of images [video].
In one part of paper it applies 2D bilateral over a frame [which its code is here ]
but in other part of paper, it acquired 1-D bilateral filter for each pixel over frames. question is how?!!
I can't realize kernel here. but Mr. Joseph Shtok mentioned it's simple. Can you please explain?
Thank you for your comments. I believe the code you referred to, specifically lines 67 and 114 in bfilter2.m, is correct as written. These lines implement the c(\xi,x) equation from Section 2.1 from the Tomasi and Manduchi paper. As they state, c is radially symmetric, with the d(\xi,x) term corresponding to the Euclidean distance between \xi and x. Expanding these expressions, the numerator of the exponent should be -(X.^2+Y.^2), not -(X-Y).^2. Your concern might come from how I've used the G matrix on these lines. This matrix is used to pre-compute c(\xi,x) for a w-by-w sized window. In this case, the origin is always the center pixel, so \sqrt((X.^2+Y.^2)) will represent the Euclidean distance of a pixel from the center of the window, where X and Y are pixel coordinates with respect to the center pixel, i.e. as given on lines 66 and 113. These geometric terms are identical for all windows, which is why I pre-computed their values. Unfortunately, the "intensity similarity" will vary for each w-by-w window. As a result, the H matrix, as given by lines 87 and 140, must be evaluated independently using a "sliding window" analysis.
Please send me an email if you have any further questions about my implementation.
06 Aug 2008
First of all, thank you for the code but, according to the Tomasi and Manduchi paper, I think that instead of:
G = exp(-(X.^2+Y.^2)/(2*sigma_d^2));
it should be:
G = exp(-(X-Y).^2/(2*sigma_d^2));
with respect to the GausSian distance weight in the bfilter2.m file.
Please, correct me if I'm wrong.
16 Jul 2008
DO Quoc Bao
Thanks alot :)
02 Jul 2008
Thanks for the hard work. I appreciate the code.
29 Apr 2008
Daniel Oldjira Fufa
Thanks for the code
18 Jan 2008
18 Dec 2007
21 Nov 2007
27 Oct 2007
Excellent method except the speed. But a lot of papers are coming out. You can go to the SIGGRAPH07 for some information.
10 Oct 2007
30 Aug 2007
21 Mar 2007
Great filter but rather slow.
Do you know if it can be vectorised or sped up in some other way?
If there is anyone out there that knows how to speed up this code please let me know.
04 Dec 2006
Very easy to understand and use! Comments precede each part. Run perfectly!