OpenCV Filters - bilateralFilter

Applies the bilateral filter to an image.

C++: void blur(InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT ) 

Python: cv2.blur(src, ksize[, dst[, anchor[, borderType]]]) → dst 

  • src – Source 8-bit or floating-point, 1-channel or 3-channel image.
  • dst – Destination image of the same size and type as src .
  • d – Diameter of each pixel neighborhood that is used during filtering. If it is non-positive, it is computed from sigmaSpace .
  • sigmaColor – Filter sigma in the color space. A larger value of the parameter means that farther colors within the pixel neighborhood (see sigmaSpace ) will be mixed together, resulting in larger areas of semi-equal color.
  • sigmaSpace – Filter sigma in the coordinate space. A larger value of the parameter means that farther pixels will influence each other as long as their colors are close enough (see sigmaColor ). When d>0 , it specifies the neighborhood size regardless of sigmaSpace . Otherwise, d is proportional to sigmaSpace .

The function applies bilateral filtering to the input image, as described in bilateralFilter can reduce unwanted noise very well while keeping edges fairly sharp. However, it is very slow compared to most filters.

Sigma values: For simplicity, you can set the 2 sigma values to be the same. If they are small (< 10), the filter will not have much effect, whereas if they are large (> 150), they will have a very strong effect, making the image look “cartoonish”.

Filter size: Large filters (d > 5) are very slow, so it is recommended to use d=5 for real-time applications, and perhaps d=9 for offline applications that need heavy noise filtering.

This filter does not work inplace.

Reference: OpenCV Documentation -  bilateralFilter

This is a sample code (C++) with images for opencv bilateral filter filter.

 string imgFileName = "lena.jpg";

 cv::Mat src = cv::imread(imgFileName);
 if (!{
    cout << "Unable to open file" << endl;
    return 1;

 cv::Mat dst;
 cv::bilateralFilter(src, dst, 20, 100, 100);


 cv::imshow("Source", src);
 cv::imshow("Filtered", dst);

 cv::imwrite("BilateralFilter.jpg", dst);

 return 0;

Filtered Image Source Image

Download complete Visual Studio project.

No comments:

Post a Comment