均值滤波也称为线性滤波,其采用的主要方法为邻域平均法。线性滤波的基本原理是用均值代替原图像中的各个像素值,即对待处理的当前像素点(x,y),选择一个模板,该模板由其近邻的若干像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点(x,y),作为处理后图像在该点上的灰度值g(x,y),即g(x,y)=1/m ∑f(x,y), m为该模板中包含当前像素在内的像素总个数。这样的方法可以平滑图像,速度快,算法简单。但是无法去掉噪声,这能微弱的减弱它。
void MeanFilter(CvMat *pGrayMat, CvMat *pFilterMat, int nWidth, int nHeight, int nWindows)
{
参数说明///
//pGrayMat:待处理图像数组
//pFilterMat:保存高斯滤波结果
//nWidth:图像宽度
//nHeight:图像高度
//nWindows:滤波窗口大小
if((nWindows%2) == 0)
{
MessageBox("此函数必须设置邻域为奇数矩阵");
return;
}
int nNumData = nWindows/2;
if((nWindows>nHeight) && (nWindows>nWidth))
{
MessageBox("滤波窗口超出许可范围,请检查!");
return;
}
for(int i=nNumData; i<(nHeight-nNumData); i++)
{
for(int j=nNumData; j<(nWidth-nNumData); j++)
{
double dData = 0.0;
int nNum = 0;
for(int m=-nNumData; m<=nNumData; m++)
{
for(int n=-nNumData; n<=nNumData; n++)
{
if((m!=0) && (n!=0))
{
dData += cvmGet(pGrayMat ,i+m, j+n);
nNum++;
}
}
}
dData /= nNum;
cvmSet(pFilterMat, i, j, dData);
}
}
}