这是我的代码:

    int Factor=3,offset=0,k,l,p,q;
    IplImage * image = cvCreateImage(cvSize(img->width, img->height),img->depth, img->nChannels);
     cvCopy (img, image, 0);
    long double mean=0,nTemp=0,c,sum=0,n=0,s=0,d=0;
    int i=0,j=0,krow,kcol;
    kernel[0][0]=kernel[0][2]=kernel[2][0]=kernel[2][2]=0;
    kernel[0][1]=kernel[1][0]=kernel[1][2]=kernel[2][1]=1;
    kernel[1][1]=-4;
    uchar* temp_ptr=0 ;
    int rows=image->height,cols=image->width,row,col;

     //calculate the mean of image and deviation

    for ( row = 1; row < rows - 2; row++ )
    {
        for ( col = 1; col < cols - 2; col++ )
        {
            nTemp = 0.0;
                for (p=0, krow = -1 ; p < 3; krow++,p++)
                {
                    for (q=0, kcol = -1; q < 3; kcol++,q++)
                    {
                        temp_ptr  = &((uchar*)(image->imageData + (image->widthStep*(row+krow))))[(col+kcol)*3];
                        for(int k=0; k < 3; k++)
                        Pixel[p][q].val[k]=temp_ptr[k];
                    }
                }
                for (i=0 ; i < 3; i++)
                {
                    for (j=0 ; j < 3; j++)
                    {
                        c = (Pixel[i][j].val[0]+Pixel[i][j].val[1]+Pixel[i][j].val[2])/Factor ;
                        nTemp += (double)c * kernel[i][j];
                    }
                }

            sum += nTemp;
            n++;
        }
    }
mean = ((double)sum / n);
    for ( row = 1; row < rows - 2; row++ )
    {
        for ( col = 1; col < cols - 2; col++ )
        {
            nTemp = 0.0;

                for (p=0, krow = -1 ; p < 3; krow++,p++)
                {
                    for (q=0, kcol = -1; q < 3; kcol++,q++)
                    {
                        temp_ptr  = &((uchar*)(image->imageData + (image->widthStep*(row+krow))))[(col+kcol)*3];
                        for(int k=0; k < 3; k++)
                        Pixel[p][q].val[k]=temp_ptr[k];
                    }
                }
                for (i=0 ; i < 3; i++)
                {
                    for (j=0 ; j < 3; j++)
                    {
                        c = (Pixel[i][j].val[0]+Pixel[i][j].val[1]+Pixel[i][j].val[2])/Factor ;
                        nTemp += (double)c * kernel[i][j];
                    }
                }

            s = (mean - nTemp);
            d += (s * s);
        }
    }
    d = d / (n - 1);
    d = (sqrt(d));
    d=d* 2;
     // Write to image
    for ( row = 1; row < rows - 2; row++ )
    {
        for ( col = 1; col < cols - 2; col++ )
        {
                nTemp = 0.0;
                for (p=0, krow = -1 ; p < 3; krow++,p++)
                {
                    for (q=0, kcol = -1; q < 3; kcol++,q++)
                    {
                        temp_ptr  = &((uchar*)(image->imageData + (image->widthStep*(row+krow))))[(col+kcol)*3];
                        for(int k=0; k < 3; k++)
                        Pixel[p][q].val[k]=temp_ptr[k];
                    }
                }
                for (i=0 ; i < 3; i++)
                {
                    for (j=0 ; j < 3; j++)
                    {
                        c = (Pixel[i][j].val[0]+Pixel[i][j].val[1]+Pixel[i][j].val[2])/Factor ;
                        nTemp += (double)c * kernel[i][j];
                    }
                }
            temp_ptr  = &((uchar*)(image->imageData + (image->widthStep*row)))[col*3];
            if (nTemp > d)
                temp_ptr[0]=temp_ptr[1]=temp_ptr[2]=255;
            else
                temp_ptr[0]=temp_ptr[1]=temp_ptr[2]=0;
        }
    }

我要去哪里错了?我以类似的方式实现了高斯滤波,我的算法有什么问题吗?

最佳答案

在计算过程中,您的代码(标记为“写入图像”)似乎覆盖了输入图像。情况不妙。创建图像的副本,计算其像素,然后删除原始图像。

07-27 13:35