0028-用OpenCV的函数bilateralFilter做双边滤波

前几篇帖子提到的均值滤波、中值滤波和高斯滤波,都属于各向同性滤波,它们对待噪声和图像的边缘信息都采取一样的态度,结果,噪声被磨平的同时,图像中具有重要地位的边缘、纹理和细节也同时被抹平了,这是我们所不希望看到的。为了解决这个问题,人们陆续提出了一些算法来把图像边缘和噪声区别对待,比如双边滤波和导向滤波,本文介绍如何使用opencv做图像的双边滤波。
关于双边滤波的原理,大家可以参考网页:http://blog.163.com/yuyang_tech/blog/static/21605008320130242441886/博主2018-11-15 14:09:49注:因163博客已经关闭,所以这篇文章大家看不到了,抱歉
OpenCV提供了函数bilateralFilter来进行双边滤波,函数原型如下
C++: void bilateralFilter(InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, int borderType=BORDER_DEFAULT )
参数意义如下:
src:输入图像
dst:输出图像
d:滤波邻域直径。如果这个值设为负数,那么这个值由参数sigmaColor计算出。
sigmaColor:滤波的色彩空间参数。这个值越大,代表滤波计算邻域内有更多的色彩权重。
sigmaSpace :滤波的距离空间参数。这个值越大,代表当颜色距离相同时,会有更多的点被影响到。如果参数d>0,则邻域大小由d指定,否则,d是sigmaSpace的一个比例结果。
示例代码如下:

图像处理开发资料、图像处理开发需求、图像处理接私活挣零花钱,可以搜索公众号"qxsf321",并关注!

//opencv版本:OpenCV3.0
//VS版本:VS2013
//Author:qxsf321.net

#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>    
#include <opencv2/imgproc/types_c.h>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/highgui/highgui_c.h>
#include <time.h>  
#include <iostream>

using namespace cv;
using namespace std;

int main()
{
        //源图像  
        Mat img_input = imread("zhi_zhi_hua.jpg");


        Mat img_output(img_input.size(), img_input.type());
        Mat noise(img_input.size(), img_input.type());  /**创建一个噪声矩阵*/
        RNG rng(time(NULL));
        rng.fill(noise, RNG::NORMAL, 10, 36);  /**高斯分布*/
        cv::add(img_input, noise, img_output);

        imshow("原图像", img_input);
        //imshow("噪声图像", noise);
        imshow("加上高斯噪声后的图像", img_output);

        Mat dst;

        bilateralFilter(img_output,dst,9,40,8);

        imshow("双边滤波后的图像", dst);

        waitKey(0);
        return EXIT_SUCCESS;
}


运行结果截图如下:

从运行截图来看,高斯滤波的效果是不如双边滤波,高斯滤波的效果大家可以参看博文https://blog.csdn.net/lehuoziyuan/article/details/84102935

猜你喜欢

转载自blog.csdn.net/lehuoziyuan/article/details/84103128