Sobel梯度算子:未获得所需的输出

时间:2017-11-22 07:08:06

标签: c image-processing sobel

我在维基百科(Bikesgray)的图像上应用了sobel算子。但我没有得到理想的输出。我的输出比维基百科中显示的输出更亮。我的代码在.pgm文件上运行。

以下是我的代码的输出和维基百科中显示的输出 enter image description here

这是我的C代码:

//image[][] is input image. temp_image[][] is output image. temp_image[][] and image[][] are global.
// 3 x 3 region of an image will be  [z1   z2  z3]
                                     [z4   z5  z6]
                                     [z7   z8  z9]

//x direction mask                   [-1  -2  -1]
                                     [0    0   0]
                                     [1    2   1]

//y direction mask                   [-1   0   1]
                                     [-2   0   2]
                                     [-1   0   1]

void find_sobel_gradient_image()
{
    int i,j;
    int gx,gy;
    double m;
    int padded_image[700][700]={0};

    //create padded image of 1pixel zero padding and copy data from image[][]
    for(i=1;i<=y_size;i++)
    {
        for(j=1;j<=x_size;j++)
        {       
            padded_image[i][j]=image[i-1][j-1];
        }
    }

    //resulting image
    for(i=1;i<=y_size;i++)
    {
        for(j=1;j<=x_size;j++)
        {
            //gx = (z7 + 2*z8 + z9)-(z1 + 2*z2+ z3)
            gx=(padded_image[i+1][j-1]+2*padded_image[i+1][j]+padded_image[i+1][j+1])-(padded_image[i-1][j-1]+2*padded_image[i-1][j]+padded_image[i-1][j+1]); 

            //gy = (z3 + 2*z6 +z9) - (z1+ 2*z4 +z7)
            gy=(padded_image[i-1][j+1]+2*padded_image[i][j+1]+padded_image[i+1][j+1])-(padded_image[i-1][j-1]+2*padded_image[i][j-1]+padded_image[i+1][j-1]);     

            m = sqrt(gx*gx+gy*gy);
            temp_image[i][j]=round(m);
        }
    }
}

注意:每个temp [i] [j]&gt; 255 ==&gt; temp [i] [j] = 255

1 个答案:

答案 0 :(得分:3)

维基百科中的描述表明它是 normalized幅度,但你已经clamped了。要规范化幅度,找到最大值和将此值映射到255的除数,然后将每个像素值除以该除数。