1.相关概念
原理:Smooth/Blur 是图像处理中最简单和常用的操作之一。使用该操作的原因之一就为了给图像预处理时候减低噪声,使用Smooth/Blur操作其背后是数学的卷积计算,通常这些卷积算子计算都是线性操作,所以又叫线性滤波。
卷积操作过程方向:从左向右,从上向下
2.常见方法原理
均值模糊:归一化盒子滤波(均值滤波)
高斯模糊:高斯滤波
使用高斯模糊去模糊图像更加平滑
3.相关API介绍
均值模糊:blur(Mat src, Mat dst, Size(xradius, yradius), Point(-1,-1));
第一个参数,InputArray类型的src,输入图像,待处理的图片深度应该为CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F之一
第二个参数,OutputArray类型的dst,目标图像
第三个参数,Size类型的ksize,内核的大小。一般这样写Size( w,h )来表示内核的大小( 其中,w 为像素宽度, h为像素高度)
第四个参数,Point类型的anchor,表示锚点(即被平滑的那个点)默认值Point(-1,-1)表示这个锚点在核的中心
第五个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT,一般用默认
高斯模糊:GaussianBlur(Mat src, Mat dst, Size(11, 11), sigmax, sigmay);
第一个参数:输入图像
第二个参数:输出图像
第三个参数:内核的大小,数字使用正奇数
第四个和第五个参数:应该为公式中指数分母的数字(个人理解)
4.代码实现
#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace std;
using namespace cv;
int main()
{
Mat src, dst1,dst2;
src = imread("D:/demo.jpg");
if (src.empty())
{
cout << "找不到源图像!" << endl;
}
imshow("源图像", src);
blur(src, dst1, Size(21, 21), Point(-1, -1));//均值模糊,Point为锚点,即改变值的点,Size中使用奇数
GaussianBlur(src, dst2,Size(21,21),11,11 );//高斯模糊
imshow("均值模糊后图像", dst1);
imshow("高斯模糊后图像", dst2);
waitKey(0);
return 0;
}