//----------------------------------------【一种改进的中值滤波策略的实现】------------------------------------
//1--传统的中值滤波器的缺点:中值滤波的效果依赖于--滤波窗口的大小,太大会使边沿模糊,太小了,则去噪效果不佳。因为
//-------噪声点和边缘点同样是灰度变化较为剧烈的像素,普通的中值滤波在改变噪声点灰度值时,会一定程度的改变边缘像素的
//-------灰度值。但是,噪声点几乎都是邻域像素的极值,而边缘往往不是,因此可以利用这个特性,来限制中值滤波。
//2--具体的改进方法如下:逐行扫描,当处理每一个像素时,判断该像素是否是滤波窗口覆盖下邻域像素的极大值和极小值。如果是
//-------则采用正常的中值滤波处理该像素;如果不是,则不处理。
//3--自适应中值滤波的效果:在实践中,这种方法,能够非常有效的除去突发的噪声点,尤其是辣椒盐噪声,并且几乎不影响边缘
//4--自适应中值滤波的由来--由于算法可以根据邻域的具体情况而自行选择执行不同的操作,因此改进的中指滤波也称为自适应中
//-------值滤波
//-----------------------------------------------------------------------------------------------------------
/**********************************************************************************************************************
*函数原型:void CImgProcess::AdaptiveMedianFilter(CImgProcess* pTo,int nFilterH,int nFilterW,int nFilterMY,int nFilterMX)
*功能:改进的中指滤波算法---自适应中值滤波
*函数参数:1--CImgProcess* pTo--源图像的指针
* 2--int nFilterH-------滤波器的高度
* 3--int nFilterW-------滤波器的宽度
* 4--int nFilterMY------滤波器的中心元素Y的坐标
* 5--int nFilterMX------滤波器的中心元素X的坐标
*函数的返回值:
* 无
***********************************************************************************************************************/
void CImgProcess::AdaptiveMedianFilter(CImgProcess* pTo,int nFilterH,int nFilterW,int nFilterMY,int nFilterMX)
{
//[1]初始化目标图像
pTo->InitPixels(0);
//[2]循环变量的定义
int i,j,k,l;
int nGray;
//[3]得到元素图片的长,宽,单位--像素(Pixel)
int nHeight=GetHeight();
int nWidth=GetWidthPixel();
//[4]邻域图像数组
int* pAryGray;
pAryGray=new int[nFilterH*nFilterW];
//[3]逐行扫描图像,进行中值滤波,行,除去边缘几行
for(i=nFilterMY;i<nHeight-nFilterH+nFilterMY+1;i++)
{
//[4]列--除去边缘几行
for(j=nFilterMX;j<nWidth-nFilterW+nFilterMX+1;j++)
{
//[5]读取滤波器数组
for(k=0;k<nFilterH;k++)
{
for(l=0;l<nFilterW;i++)
{
//[6]原图像第i+k-nFilterMY行,第j+1-nFilterMX列的像素值
nGray=GetGray(j+1-nFilterMX,i+k-nFilterMY);
//[7]保存像素值
pAryGray[k*nFilterW+1]=nGray;
}//l
}//k
//[8]通过排序获取中指
nGray=GetMedianValue(pAryGray,nFilterH*nFilterW);
//[9]判断当前像素是否是邻域的极大值或极小值
if(GetGray(j,i)==pAryGray[0]||GetGray(j,i)==pAryGray[nFilterH*nFilterW-1])
{
//[10]如果是极值,以中值作为相应
pTo->SetPixel(j,i,RGB(nGray,nGray,nGray));
}
else
{
//[11]不是极值,则不改变原图像的值
pTo->SetPixel(j,i,GetGray(j,i));
}
}//j
}//i
delete[] pAryGray;
}