均值滤波、高斯滤波都是线性滤波:原始数据与滤波结果是一种线性的算术运算
中值滤波和双边缘滤波是非线性滤波:原始数据与滤波结果是一种逻辑关系,即通过比较一定邻域内的灰度值大小来实现的
1 、中值滤波
medianBlur(Mat src, Mat dest, ksize)
像素排序,取中间值。对椒盐噪声有很好的抑制作用
image.png
2 、双边缘滤波
这里有一篇博客写的非常好,我抛砖引玉一下吧。双边缘滤波
双边滤波采用了两个高斯滤波的结合。一个负责计算空间邻近度的权值,也就是常用的高斯滤波器原理。而另一个负责计算像素值相似度的权值。在两个高斯滤波的同时作用下,就是双边滤波。
当图像在变化程度平缓的区域时,邻域中的像素值(RGB值)差距相差不大。此时wr无限接近于1,因此此时的双边就是普通的高斯滤波,达到对图像平滑的效果。
当图像在变化程度剧烈的区域,比如在边缘区域时,邻域中的像素值(RGB值)差距相差很大。此时wr朝0值趋近,颜色差值越大,wr越逼近0,最终整个式子的值逼近于0。最终的结果是权值为0。因此在最终计算时,该处将不影响输出值。
image.png
image.png
3 、整体代码测试
中值滤波 :medianBlur 双边缘滤波:bilateralFilter
CV_EXPORTS_W void medianBlur( InputArray src, OutputArray dst, int ksize );
. InputArray src: 输入图像
. OutputArray dst: 输出图像
. int ksize: 滤波模板的尺寸大小
CV_EXPORTS_W void bilateralFilter( InputArray src, OutputArray dst, int d,
double sigmaColor, double sigmaSpace,
int borderType = BORDER_DEFAULT );
. InputArray src: 输入图像
. OutputArray dst: 输出图像
. int d: 表示在过滤过程中每个像素邻域的直径范围。
. double sigmaColor: 颜色空间过滤器的sigma值。
. double sigmaSpace: 坐标空间中滤波器的sigma值。
. int borderType=BORDER_DEFAULT: 用于推断图像外部像素的某种边界模式,有默认值BORDER_DEFAULT.
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace cv;
#include <opencv2/core/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
Mat src, dst,dst1;
//src = imread("D:\\imageTest.jpg");
src = imread("D:\\10.jpg");
dst1 = imread("D:\\11.jpg");
if (!src.data) {
printf("could not load image...\n");
return -1;
}
namedWindow("input image0", CV_WINDOW_AUTOSIZE);
imshow("input image0", dst1);
//medianBlur(dst1,dst,3);//中值滤波
bilateralFilter(dst1, dst, 15, 150, 10);//双边缘滤波
namedWindow("双边缘滤波", CV_WINDOW_AUTOSIZE);
imshow("双边缘滤波", dst);
waitKey();
return 0;
}
双边缘滤波
双边缘滤波
中值滤波