中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。其实现过程为:
1)通过从图像中的某个采样窗口取出奇数个数据进行排序
2)用排序后的中值作为当前像素点的灰度值
在图像处理中,中值滤波常用来保护边缘信息,是经典的平滑噪声的方法,该方法法对消除椒盐噪音非常有效,在光学测量条纹图象的相位分析处理方法中有特殊作用,但在条纹中心分析方法中作用不大。
Void MedianFilter(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;
unsigned char* nData = new unsigned char[nWindows*nWindows-1]; //保存邻域中的数据
if((nWindows>nHeight) && (nWindows>nWidth))
{
MessageBox("滤波窗口超出许可范围,请检查!");
return;
}
for(int i=nNumData; i<(nHeight-nNumData); i++)
{
for(int j=nNumData; j<(nWidth-nNumData); j++)
{
int nIndex = 0;
for(int m=-nNumData; m<=nNumData; m++)
{
for(int n=-nNumData; n<=nNumData; n++)
{
if((m!=0) && (n!=0))
nData[nIndex++] = (unsigned char)cvmGet(pGrayMat, i+m, j+n);
}
}
InsertSort(nData, nIndex); //排序
unsigned char nMedium = 0;
if(nIndex%2==0)
nMedium = (unsigned char)((nData[(nIndex-1)/2] + nData[(nIndex+1)/2])/2);
else
nMedium = nData[nIndex/2];
cvmSet(pFilterMat, i, j, nMedium);
}
}
delete[]nData;
}