1. 模糊原理

Smooth/Blur是图像处理中最简单和常用的操作之一
使用该操作的原因之一就是为了给图像预处理的时候减低噪声
使用Smooth/Blur操作其背后是数学的卷积计算

通常这些卷积算子计都是线性操作,所以又叫线性滤波

2. 均值滤波

窗口内所有数据相加,然后取平均值替换中心点的像素值

3. 高斯滤波

高斯模糊的原理是利用高斯函数,距离窗口正中心越近的像素,其权重就越大,中心点的像素的权重最大。

4. 中值滤波

中值滤波对椒盐噪声有很好的抑制作用,椒盐噪声就是在图像上有很明显的噪点
将窗口内的像素值进行排序,取中值替换掉中心点的像素值
这里可以衍生到最大值滤波和最小值滤波

5. 双边滤波

均值滤波无法克服边缘像素信息缺失缺陷。原因是均值滤波是基于平均权重
高斯模糊部分克服了该缺陷,但是无法完全避免,因为没有考虑像素值的不同
高斯双边模糊是边缘保留的滤波方法,避免了边缘信息的丢失,保留了图像轮廓不变

6. 相关API

均值模糊

-blur(Mat src,Mat dst,Size(xradius,yradius),Point(-1,-1));
//参数说明 1源图像 2目标图像 3均值窗口的大小 4中心点,(-1,-1)默认就是最中心的点

高斯模糊

-GaussianBlur(Mat src,Mat dst,Size(11,11),sigmax,sigmay);
		其中Size(x,y), x,y必须是整数且必须是奇数

中值模糊

medianBlur(Mat src,Mat dest,ksize)  //ksize是窗口的大小

双边模糊(先双边模糊再提高图像对比度,对人像来说会有意想不到的效果)

bilateralFilter(src,dest,d=15,150,3)
-15计算的半径,半径之内的像素会被纳入计算,如果提供-1则根据sigma space参数取值
-150 sigma color决定多少差值之内的像素会被计算
-3 sigma space 如果d的值大于0则声明无效,否则根据它来计算d的值

代码演示:

#include <opencv2/opencv.hpp>
#include<iostream>
#include<math.h>

using namespace cv;
using namespace std;

int main(int argc, int argv) {
	Mat src,dst_blur,dst_gaussian,dst_median,dst_bilateral;
	src = imread("D:/image/img1.jpg");
	if (src.empty()) {
		printf("could not load image...\n");
		return -1;
	}

	blur(src, dst_blur, Size(3, 3), Point(-1, -1));  //均值滤波
	GaussianBlur(src, dst_gaussian, Size(3, 3), 11, 11);  //高斯滤波
	medianBlur(src, dst_median, 3);  //中值滤波
	bilateralFilter(src,dst_bilateral,15,150,3);//双边滤波


	namedWindow("src", WINDOW_AUTOSIZE);
	imshow("src", src);
	namedWindow("dst_blur", WINDOW_AUTOSIZE);
	imshow("dst_blur", dst_blur);
	namedWindow("dst_gaussian", WINDOW_AUTOSIZE);
	imshow("dst_gaussian", dst_gaussian);
	namedWindow("dst_median", WINDOW_AUTOSIZE);
	imshow("dst_median", dst_median);
	namedWindow("dst_bilateral", WINDOW_AUTOSIZE);
	imshow("dst_bilateral", dst_bilateral);

	waitKey(0);
	return 0;
}