高斯滤波
做图像处理时, 发现很多算法都要用到高斯滤波,特别是最近做验证码识别时用到的一些算法都涉及到高斯滤波。虽然高斯滤波比较简单,但还是把它记下来,就当是日记了。
//一维高斯滤波
//width IN 宽度
//sigma IN 输入参数
//guassianTemplate OUT 输出高斯模板
bool GenerateGuassian1D(int width,double sigma, double *guassianTemplate)
{
if (NULL == guassianTemplate)
{
return false ;
}
if (width %2 != 1 && sigma > 0)
{
return false ;
}
// 一维高斯数据滤波器
int nSize = width*width;
int nHalfLen = width/2; // 窗口长度的1/2
// 高斯滤波系数的总和
double total = 0;
for (int i=0;i<nSize;i++)
{
*(guassianTemplate + i) = exp(-((i-nHalfLen)*(i-nHalfLen))/(2*sigma*sigma));
total += *(guassianTemplate + i);
}
//归一化
for (i=0;i<nSize;i++)
{
*(guassianTemplate + i) /=total;
}
return true;
}
//保持width =height = 2k+1
//保证guassianTemplate 的大小为(2*k+1)*(2*k+1)
//width IN 高斯模板宽
//height IN高斯模板高
//sigma IN输入参数
//guassianTemplate OUT 输出高斯模板
bool GenerateGuassian2D(int width, int height, double sigma, double *guassianTemplate)
{
if (NULL == guassianTemplate)
{
return false;
}
if (width %2 != 1 && height %2 != 1 && sigma > 0)
{
return false;
}
//高斯模板为(2*k+1)*(2*k+1)
double total = 0;
for(int i=0;i<width;i++)
for(int j=0;j<height;j++)
{
guassianTemplate[int(width)*j+i]=exp(-((i-int(width/2))*(i-int(width/2))+(j-int(height/2))*(j-int(height/2)))/(2*sigma*sigma));
total += guassianTemplate[int(width)*j+i];
}
//归一化,高斯模板的所有元素总和为1
for(int i=0;i<width;i++)
{
for(int j=0;j<height;j++)
{
guassianTemplate[int(width)*j+i]/=total;
}
}
return true;
}