1、高斯函数(一维)数学定义
高斯函数的曲线形状为钟状,如图1所示,上式中a、b、c为常实数,其中a为高斯曲线的尖峰,b为高斯函数曲线尖峰位置的X坐标位置,c为标准差,表征高斯函数曲线的宽度
2、二维高斯函数
上式中(x0,y0)为二维高斯函数中心。бx、бy为标准差。二维高斯函数图像如图2所示
3、图像滤波之高斯滤波
在图像处理中,利用二维高斯函数对图像进行滤波,本质上是利用高斯函数生成一个窗口,窗口中各位置权值总和为1,窗口中各位置的权重根据各位置与窗口中心位置之间的欧式距离计算获得,总体呈中间大边缘小趋势。其数学滤波器定义为:
高斯滤波器通过生成的高斯核,利用窗口中各位置的权重对对图像进行滤波处理,将中心点像素值与其邻域内像素值进行紧密结合,从而实现对噪声的滤除。
4、高斯滤波代码
#include<opencv2/opencv.hpp>
#include<iostream>
bool GuassFilters(cv::Mat inputImage, cv::Mat& outputImage, int sizeD, float sigma)
{
if (inputImage.empty())
return false;
cv::Mat bordImage;
cv::copyMakeBorder(inputImage, bordImage, sizeD / 2, sizeD / 2, sizeD / 2, sizeD / 2, cv::BORDER_REPLICATE);
outputImage = cv::Mat(inputImage.size(), CV_8UC1, cv::Scalar(0));
for (int i = sizeD / 2; i < bordImage.rows - sizeD / 2; i++)
{
for (int j = sizeD / 2; j < bordImage.cols - sizeD / 2; j++)
{
float pixWSum = 0.0f;
float kernelSum = 0.0f;
for (int x = i - sizeD / 2; x < i + sizeD / 2 + 1; x++)
{
for (int y = j - sizeD / 2; y < j + sizeD / 2 + 1; y++)
{
float kernelW = exp(-((x - i)*(x - i) - (y - j)*(y - j)) / (2 * sigma*sigma))/(2*3.14* sigma*sigma);
pixWSum += bordImage.at<uchar>(x, y)*kernelW;
kernelSum += kernelW;
}
}
outputImage.at<uchar>(i - sizeD / 2, j - sizeD / 2) = pixWSum / kernelSum;
}
}
return true;
}
void main()
{
cv::Mat src = cv::imread("testImage.png", 0);
cv::Mat dst;
cv::Size sizeK = cv::Size(5, 5);
bool sign = GuassFilters(src, dst, 5, 3);
cv::waitKey(0);
}