中值滤波

 中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。其实现过程为:

      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;  

}  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值