基本原理:
双边滤波器是针对高斯平滑的提升版本,高斯平滑根据像素邻域的距离决定权重,生成权重的函数为高斯函数,所以叫高斯平滑或者高斯滤波,效果是使图像模糊,并一定程度上的保存边缘,双边滤波的改进是增加了灰度值的影响,也就是邻域的像素灰度值如果和中心像素的灰度值越接近,那么权值在高斯权值的基础上在加上一个相对较大的权值,相反,如果灰度差很大,将会给已生成的高斯模板对应的位置加上一个小的权值,以此类推,并将模板系数归一化(和为1,其目的是完全平滑的图像结果不变),因此模板的系数不再单纯的依赖位置关系,更依赖于灰度关系,因此边缘将能够被有效的保存,但是这是一个相当耗时的操作。
OpenCV双边滤波:
#include "opencv2/core/core.hpp"
#include"opencv2/highgui/highgui.hpp"
#include"opencv2/imgproc/imgproc.hpp"
#include <iostream>
using namespace cv;
void main()
{
// load image
Mat image = imread("../03.jpg");
if (!image.data)
{
printf("读取图片文件失败\n");
exit(0);
}
//resize(image, image, Size(), 0.3, 0.3);
imshow("salted image", image);
//median filte
Mat resutl;
bilateralFilter(image, resutl, 45, 25 * 2, 25 / 2);
//display result
imshow("median filted image", resutl);
waitKey();
}
原图:
滤波一次:
滤波两次: