#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/core/core.hpp>
#include<iostream>
using namespace std;
using namespace cv;
//高斯平滑(高斯模糊)实现
void myGaussianBlur(Mat& src, Mat& result, int baseKernel, double delta)
{
//高斯核半径
int kerR = baseKernel / 2;
//高斯核因子
Mat kernel = Mat_<double>(baseKernel, baseKernel);
//归一化参数
double alpha = 1 / ((2*22/7)*delta*delta);
//核函数生成
for (int i = -kerR; i <= kerR; i++)
{
for (int j = -kerR; j <= kerR; j++)
{
kernel.at<double>(i + kerR, j + kerR) = exp(-(i*i+j*j)/(2*delta*delta))*alpha;
}
}
result = src.clone();
double pix;
for (int i = kerR; i < src.rows - kerR; i++)
{
for (int j = kerR; j < src.cols - kerR; j++)
{
pix = 0;
for (int pi = -kerR; pi <= kerR; pi++)
{
for (int pj = -kerR; pj <= kerR; pj++)
{
pix += src.at<uchar>(i+pi, j+pj)*kernel.at<double>(kerR+pi,kerR+pj);
}
}
result.at<uchar>(i-kerR, j-kerR) = pix;
}
}
}
int main()
{
//imread中0表示灰度返回,1表示原图返回
Mat src = imread("E:\\研究生\\学习材料\\学习书籍\\OpenCV图像处理编程实例-源码-20160801\\《OpenCV图像处理编程实例-源码-20160801\\images\\flower3.jpg",0);
if (!src.data)
return -1;
Mat dst;
//dst=addSaltNoise(src, 100);
myGaussianBlur(src, dst, 3, 1);
//imshow("SaltNoise",dst);
imshow("GaussianBlur", dst);
waitKey(0);
return(0);
}
上一篇中值滤波中并没有用到原图像边缘像素,直接将原图像边界像素放入目标图像中,上述这个高斯模糊使用了原图的边界像素。