平滑处理,有时也称模糊处理,是图像处理领域最常用的操作。平滑的目的主要是用来去除噪声。通常平滑操作是通过卷积操作(注:实际上是相关操作,后面的叙述对这两个操作不加区分)完成。下面介绍几种常用的平滑滤波操作。
均值滤波
-
均值滤波是最简单的一种滤波操作,每个被滤波像素通过它邻近像素均值计算得到。
-
均值滤波的kernel如下:
高斯滤波
-
高斯滤波的核是通过高斯函数构建,越靠近中心的像素的值越大,这也反映了图像空域间关系,越邻近的像素相关性越强。
-
二维高斯函数如下:
中值滤波
-
以kernel里像素的中值作为被滤波后像素的值。
-
中值滤波法是一种非线性平滑技术。
-
中值滤波法对消除椒盐噪音非常有效。
双边滤波
-
上面的滤波方法在平滑图像时不仅会平滑噪声,往往还会模糊图像边缘。这是由于它们构造kernel时只用了空间位置信息。
-
双边滤波构造kernel不仅使用空间位置信息,还会使用颜色信息。
在opencv里提供了各种滤波器的调用接口,代码如下:
#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
namedWindow("Smoothing Demo", WINDOW_AUTOSIZE);
Mat src = imread("G:\\opencvDemo\\lena.jpg");
Mat blurImg;
Mat gaussianImg;
Mat medianImg;
Mat bilteralImg;
Mat boxImg;
Mat filter2DImg;
blur(src, blurImg, Size(5, 5));
boxFilter(src, boxImg, -1, Size(5, 5), Point(-1, -1), true);
GaussianBlur(src, gaussianImg, Size(5, 5),0,0);
medianBlur(src, medianImg, 5);
bilateralFilter(src, bilteralImg, 5, 10, 2.5);
Mat kernal = Mat::ones(Size(5, 5), CV_8UC1);
filter2D(src, filter2DImg, -1, kernal);
//imshow("Smoothing Demo", bilteralImg);
imwrite("blurImg55.jpg", blurImg);
imwrite("boxImg55.jpg", boxImg);
imwrite("gaussianImg55.jpg", gaussianImg);
imwrite("medianImg55.jpg", medianImg);
imwrite("bilteralImg55.jpg", bilteralImg);
imwrite("filter2DImg55.jpg", filter2DImg);
//waitKey(0);
return 0;
}