bilateral filter双边滤波器的通俗理解

bilateral filter双边滤波器的通俗理解
    图像去噪的方法很多,如中值滤波,高斯滤波,维纳滤波等等。但这些降噪方法容易模糊图片的边缘细节,对于高频细节的保护效果并不明显。相比较而言,bilateral filter双边滤波器可以很好的边缘保护,即可以在去噪的同时,保护图像的边缘特性。双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的(不理解这几个概念没关系,后面会慢慢解释)。

1. 双边滤波(Bilateral filter)的原理
     双边滤波器之所以能够做到在平滑去噪的同时还能够很好的保存边缘(Edge Preserve),是由于其滤波器的核由两个函数生成:空间域核和值域核

(1)空间域核:由像素位置欧式距离决定的模板权值w_d

w_d(i,j,k,l) = exp(-\frac{(i-k)^2 + (j -l)^2}{2\sigma_d^2})
                                                 

    q(i,j)为模板窗口的其他系数的坐标;p(k,l)其中为模板窗口的中心坐标点;\sigma_d为高斯函数的标准差。 使用该公式生成的滤波器模板和高斯滤波器使用的模板是没有区别的。

  

                                               

2. 双边滤波(Bilateral filter)理解
     双边滤波(Bilateral filter)其综合了高斯滤波器(Gaussian Filter)和α-截尾均值滤波器(Alpha-Trimmed mean Filter)的特点,同时考虑了空间域与值域的差别,而Gaussian Filter和α均值滤波分别只考虑了空间域和值域差别。高斯滤波器只考虑像素间的欧式距离,其使用的模板系数随着和窗口中心的距离增大而减小;α-截尾均值滤波器则只考虑了像素灰度值之间的差值,去掉α%的最小值和最大值后再计算均值。

 



     双边滤波器可以很好的保存图像边缘细节而滤除掉低频分量的噪音,但是双边滤波器的效率不是太高,花费的时间相较于其他滤波器而言也比较长。 
     对于简单的滤波而言,可以将两个sigma值设置成相同的值,如果值<10,则对滤波器影响很小,如果值>150则会对滤波器产生较大的影响,会使图片看起来像卡通。 

 示例代码:

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
 
using namespace std;
using namespace cv;
 
//定义全局变量
const int g_ndMaxValue = 100;
const int g_nsigmaColorMaxValue = 200;
const int g_nsigmaSpaceMaxValue = 200;
int g_ndValue;
int g_nsigmaColorValue;
int g_nsigmaSpaceValue;
 
Mat g_srcImage;
Mat g_dstImage;
 
//定义回调函数
void on_bilateralFilterTrackbar(int, void*);
 
int main()
{
    g_srcImage = imread("lena.jpg");
 
    //判断图像是否加载成功
    if(g_srcImage.empty())
    {
        cout << "图像加载失败!" << endl;
        return -1;
    }
    else
        cout << "图像加载成功!" << endl << endl;
 
    namedWindow("原图像", WINDOW_AUTOSIZE);
    imshow("原图像", g_srcImage);
 
    //定义输出图像窗口属性和轨迹条属性
    namedWindow("双边滤波图像", WINDOW_AUTOSIZE);
    g_ndValue = 10;
    g_nsigmaColorValue = 10;
    g_nsigmaSpaceValue = 10;
 
    char dName[20];
    sprintf(dName, "邻域直径 %d", g_ndMaxValue);
 
    char sigmaColorName[20];
    sprintf(sigmaColorName, "sigmaColor %d", g_nsigmaColorMaxValue);
 
    char sigmaSpaceName[20];
    sprintf(sigmaSpaceName, "sigmaSpace %d", g_nsigmaSpaceMaxValue);
 
    //创建轨迹条
    createTrackbar(dName, "双边滤波图像", &g_ndValue, g_ndMaxValue, on_bilateralFilterTrackbar);
    on_bilateralFilterTrackbar(g_ndValue, 0);
 
    createTrackbar(sigmaColorName, "双边滤波图像", &g_nsigmaColorValue,
                     g_nsigmaColorMaxValue, on_bilateralFilterTrackbar);
    on_bilateralFilterTrackbar(g_nsigmaColorValue, 0);
 
    createTrackbar(sigmaSpaceName, "双边滤波图像", &g_nsigmaSpaceValue,
                    g_nsigmaSpaceMaxValue, on_bilateralFilterTrackbar);
    on_bilateralFilterTrackbar(g_nsigmaSpaceValue, 0);
 
    waitKey(0);
 
    return 0;
}
 
void on_bilateralFilterTrackbar(int, void*)
{
    bilateralFilter(g_srcImage, g_dstImage, g_ndValue, g_nsigmaColorValue, g_nsigmaSpaceValue);
    imshow("双边滤波图像", g_dstImage);
}


【尊重原创,转载请注明出处】:https://blog.csdn.net/guyuealian/article/details/82660826

参考资料:

【1】https://www.cnblogs.com/wangguchangqing/p/6416401.html

【2】https://blog.csdn.net/MoFMan/article/details/77482794

 
 ———————————————— 
版权声明:本文为CSDN博主「pan_jinquan」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/guyuealian/article/details/82660826

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页