deleted and restored “FilterImage” function

本文介绍了一种图像滤波算法的实现方法,包括平滑、锐化、边缘检测等多种滤波模板的应用。通过具体示例代码展示了不同模板如何应用于图像处理中,如高斯平滑、拉普拉斯锐化及各种方向的Sobel算子等。

void CGainOffsetTestDlg::FilterImage(int *pDst, WORD *pSrc, int nWidth, int nHeight, UINT nMode)
{
    //template array
    float Template_Smooth_Box[9]={1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f};
    float Template_Smooth_Gauss[9]={1.0f,2.0f,1.0f,2.0f,4.0f,2.0f,1.0f,2.0f,1.0f};
    float Template_Sharpen_Laplacian[9]={-1.0f,-1.0f,-1.0f,-1.0f,9.0f,-1.0f,-1.0f,-1.0f,-1.0f};
    float Template_HSobel[9]={        -1.0f,         0.0f,         1.0f,
                                    -2.0f,         0.0f,         2.0f,
                                    -1.0f,         0.0f,         1.0f};
    float Template_VSobel[9]={        -1.0f,        -2.0f,        -1.0f,
                                     0.0f,         0.0f,         0.0f,
                                     1.0f,         2.0f,         1.0f};
    float Template_HIsoSobel[9]={    -1.0f,         0.0f,         1.0f,
                                    -1.4142f,     0.0f,         1.4142f,
                                    -1.0f,         0.0f,         1.0f};
    float Template_VIsoSobel[9]={    -1.0f,        -1.4142f,    -1.0f,
                                     0.0f,         0.0f,         0.0f,
                                     1.0f,         1.4142f,     1.0f};
//    float Template_Log[25]={        -2.0f,        -4.0f,        -4.0f,        -4.0f,        -2.0f,
//                                    -4.0f,         0.0f,         8.0f,         0.0f,        -4.0f,
//                                    -4.0f,         8.0f,         24.0f,         8.0f,        -4.0f,
//                                    -4.0f,         0.0f,         8.0f,         0.0f,        -4.0f,
//                                    -2.0f,        -4.0f,        -4.0f,        -4.0f,        -2.0f};
    float Template_Diagonal[9]={    -1.0f,        -1.4142f,     0.0f,
                                    -1.414f,     0.0f,         1.4142f,
                                     0.0f,         1.4142f,     1.0f};
    float Template_DSobel[9]={        -1.0f,        -2.0f,         0.0f,
                                    -2.0f,         0.0f,         2.0f,
                                     0.0f,         2.0f,         1.0f};
    float Template_DXSobel[9]={         0.0f,         2.0f,         1.0f,
                                    -2.0f,         0.0f,         2.0f,
                                    -1.0f,        -2.0f,         0.0f};
    int x=0,y=0;
    float coef=0,TempNum=0;
    float CoefArray[9];
    switch(nMode)
    {
    case TEMPLATE_SMOOTH_BOX:
        coef=(float)(1.0/9.0);
        memcpy(CoefArray,Template_Smooth_Box,9*sizeof(float));
        break;
    case TEMPLATE_SMOOTH_GAUSS:
        coef=(float)(1.0/16.0);
        memcpy(CoefArray,Template_Smooth_Gauss,9*sizeof(float));
        break;
    case TEMPLATE_SHARPEN_LAPLACIAN:
        coef=(float)1.0;
        memcpy(CoefArray,Template_Sharpen_Laplacian,9*sizeof(float));
        break;
    case TEMPLATE_SOBEL_H:
        coef=(float)1.0;
        memcpy(CoefArray,Template_HSobel,9*sizeof(float));
        break;
    case TEMPLATE_SOBEL_V:
        coef=(float)1.0;
        memcpy(CoefArray,Template_VSobel,9*sizeof(float));
        break;
    case TEMPLATE_SOBEL_D:
        coef=(float)1.0;
        memcpy(CoefArray,Template_DSobel,9*sizeof(float));
        break;
    case TEMPLATE_SOBEL_DX:
        coef=(float)1.0;
        memcpy(CoefArray,Template_DXSobel,9*sizeof(float));
        break;
    case TEMPLATE_ISOSOBEL_H:
        coef=(float)1.0;
        memcpy(CoefArray,Template_HIsoSobel,9*sizeof(float));
        break;
    case TEMPLATE_ISOSOBEL_V:
        coef=(float)1.0;
        memcpy(CoefArray,Template_VIsoSobel,9*sizeof(float));
        break;
    case TEMPLATE_DIAGONAL_S:
        coef=(float)1.0f;
        memcpy (CoefArray,Template_Diagonal,9*sizeof(float));
        break;
    }
    //    memcpy (pDst,pSrc,nWidth*nHeight);

    for(y=1;y    {
        for(x=1;x        {
            int temp=(y)*nWidth+x;
            TempNum =((float)pSrc[temp+nWidth-1])*    CoefArray[0];
            TempNum+=((float)pSrc[temp+nWidth])     *    CoefArray[1];
            TempNum+=((float)pSrc[temp+nWidth+1])*    CoefArray[2];
            TempNum+=((float)pSrc[temp-1])         *    CoefArray[3];
            TempNum+=( float)pSrc[temp]             *    CoefArray[4];
            TempNum+=((float)pSrc[temp+1])         *    CoefArray[5];
            TempNum+=((float)pSrc[temp-nWidth-1])*    CoefArray[6];
            TempNum+=((float)pSrc[temp-nWidth])     *    CoefArray[7];
            TempNum+=((float)pSrc[temp-nWidth+1])*    CoefArray[8];
            TempNum*=coef;
            pDst[temp] = (int) (TempNum);
        }
    }
}

void FilterImage(int *pDst, int *pSrc, int nWidth, int nHeight, UINT nMode)
{
    //template array
    float Template_Smooth_Box[9]={1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f};
    float Template_Smooth_Gauss[9]={1.0f,2.0f,1.0f,2.0f,4.0f,2.0f,1.0f,2.0f,1.0f};
    float Template_Sharpen_Laplacian[9]={-1.0f,-1.0f,-1.0f,-1.0f,9.0f,-1.0f,-1.0f,-1.0f,-1.0f};
    float Template_HSobel[9]={        -1.0f,         0.0f,         1.0f,
                                    -2.0f,         0.0f,         2.0f,
                                    -1.0f,         0.0f,         1.0f};
    float Template_VSobel[9]={        -1.0f,        -2.0f,        -1.0f,
                                     0.0f,         0.0f,         0.0f,
                                     1.0f,         2.0f,         1.0f};
    float Template_HIsoSobel[9]={    -1.0f,         0.0f,         1.0f,
                                    -1.4142f,     0.0f,         1.4142f,
                                    -1.0f,         0.0f,         1.0f};
    float Template_VIsoSobel[9]={    -1.0f,        -1.4142f,    -1.0f,
                                     0.0f,         0.0f,         0.0f,
                                     1.0f,         1.4142f,     1.0f};
//    float Template_Log[25]={        -2.0f,        -4.0f,        -4.0f,        -4.0f,        -2.0f,
//                                    -4.0f,         0.0f,         8.0f,         0.0f,        -4.0f,
//                                    -4.0f,         8.0f,         24.0f,         8.0f,        -4.0f,
//                                    -4.0f,         0.0f,         8.0f,         0.0f,        -4.0f,
//                                    -2.0f,        -4.0f,        -4.0f,        -4.0f,        -2.0f};
    float Template_Diagonal[9]={    -1.0f,        -1.4142f,     0.0f,
                                    -1.414f,     0.0f,         1.4142f,
                                     0.0f,         1.4142f,     1.0f};
    float Template_DSobel[9]={        -1.0f,        -2.0f,         0.0f,
                                    -2.0f,         0.0f,         2.0f,
                                     0.0f,         2.0f,         1.0f};
    float Template_DXSobel[9]={         0.0f,         2.0f,         1.0f,
                                    -2.0f,         0.0f,         2.0f,
                                    -1.0f,        -2.0f,         0.0f};
    int x=0,y=0;
    float coef=0,TempNum=0;
    float CoefArray[9];
    switch(nMode)
    {
    case TEMPLATE_SMOOTH_BOX:
        coef=(float)(1.0/9.0);
        memcpy(CoefArray,Template_Smooth_Box,9*sizeof(float));
        break;
    case TEMPLATE_SMOOTH_GAUSS:
        coef=(float)(1.0/16.0);
        memcpy(CoefArray,Template_Smooth_Gauss,9*sizeof(float));
        break;
    case TEMPLATE_SHARPEN_LAPLACIAN:
        coef=(float)1.0;
        memcpy(CoefArray,Template_Sharpen_Laplacian,9*sizeof(float));
        break;
    case TEMPLATE_SOBEL_H:
        coef=(float)1.0;
        memcpy(CoefArray,Template_HSobel,9*sizeof(float));
        break;
    case TEMPLATE_SOBEL_V:
        coef=(float)1.0;
        memcpy(CoefArray,Template_VSobel,9*sizeof(float));
        break;
    case TEMPLATE_SOBEL_DX:
        coef=(float)1.0;
        memcpy(CoefArray,Template_DXSobel,9*sizeof(float));
        break;
    case TEMPLATE_SOBEL_D:
        coef=(float)1.0;
        memcpy(CoefArray,Template_DSobel,9*sizeof(float));
        break;
    case TEMPLATE_ISOSOBEL_H:
        coef=(float)1.0;
        memcpy(CoefArray,Template_HIsoSobel,9*sizeof(float));
        break;
    case TEMPLATE_ISOSOBEL_V:
        coef=(float)1.0;
        memcpy(CoefArray,Template_VIsoSobel,9*sizeof(float));
        break;
    case TEMPLATE_DIAGONAL_S:
        coef=(float)1.0f;
        memcpy (CoefArray,Template_Diagonal,9*sizeof(float));
        break;
    }
    //    memcpy (pDst,pSrc,nWidth*nHeight);

    for(y=1;y    {
        for(x=1;x        {
            int temp=(y)*nWidth+x;
            TempNum =((float)pSrc[temp+nWidth-1])*CoefArray[0];
            TempNum+=((float)pSrc[temp+nWidth])*CoefArray[1];
            TempNum+=((float)pSrc[temp+nWidth+1])*CoefArray[2];
            TempNum+=((float)pSrc[temp-1])*CoefArray[3];
            TempNum+=( float)pSrc[temp]*CoefArray[4];
            TempNum+=((float)pSrc[temp+1])*CoefArray[5];
            TempNum+=((float)pSrc[temp-nWidth-1])*CoefArray[6];
            TempNum+=((float)pSrc[temp-nWidth])*CoefArray[7];
            TempNum+=((float)pSrc[temp-nWidth+1])*CoefArray[8];
            TempNum*=coef;
            pDst[temp] = (int) (TempNum);
        }
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值