【问题标题】:Sobel gradient operator: Not getting desired outputSobel梯度算子:没有得到想要的输出
【发布时间】:2018-05-05 20:09:37
【问题描述】:

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

这是我的代码输出和维基百科中显示的输出

这是我的 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 ] > 255 ==> temp[ i ][ j] = 255

【问题讨论】:

  • 可能他们使用的矩阵与你的不同。
  • 您没有显示保存或显示图像的代码 - 也许这两个函数之一也会使您的图像正常化。
  • 我的输出是一个 .pgm 文件。在输出文件中,强度值 [0,255] 在那里。 (每行一个值)。输出文件是这样的(就像 .pgm 文件一样):- #p2 #comment #image dimension #max intensity value temp_image[1][1] temp_image[1][2] temp_image[1][3] 。 ..等等
  • @PaulOgilvie OP 正在避免与在图像边缘查看当前像素的上方、下方、左侧和右侧相关的问题。
  • 一种可能的解释是 Sobel 算子返回数学梯度乘以 8。维基百科上的梯度图像可能通过应用额外的 1/8 比例因子来解释这一事实。

标签: c image-processing sobel


【解决方案1】:

Wikipedia 中的描述说它是 normalized 震级,但您却拥有 clamped 震级。要标准化幅度,请找到最大值和将该值映射到 255 的除数,然后将每个像素值除以该除数。

【讨论】:

  • 感谢您的帮助。它可能对其他图像有用。但是对于我选择的图像 newMax = Max =255 , newMin = Min = 0。所以 In = I .
  • 根据应用程序,最好避免饱和(以保持最强边缘的强度信息)或强制饱和(以保持低对比度细节)。非线性对比度拉伸也可能有用。
猜你喜欢
  • 2014-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-16
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多