【问题标题】:Sobel Edge Detection, edge orientationSobel 边缘检测,边缘定向
【发布时间】:2011-09-13 16:25:26
【问题描述】:

我已经实现了一个 Sobel 边缘检测器,并且对计算边缘方向有一些疑问。

在完成 sobel 核卷积后,我正在使用这个函数来计算边缘强度。

Gxy = sqrt( pow(Gx, 2) + pow(Gy,2) )

其中 Gx 是索贝尔核在 X 方向上的卷积之和,Gy 是索贝尔核在 Y 方向上的卷积之和。 (注意X和Y方向的sobel核是不同的核)

Y 内核:

  • 1 2 1
  • 0 0 0
  • -1 -2 -1

X 内核:

  • -1 0 1
  • -2 0 2
  • -1 0 1

当我尝试计算边缘方向(theta 以度为单位)时,我使用以下规则:

  • 如果 Gy == 0 且 Gx == 0,则 theta = 0
  • 如果 Gy != 0 且 Gx == 0,则 theta = 90
  • 否则,θ = (arctan( Gy / Gx ) * 180) / PI

我所有的文档都告诉我角度应该 > 0 并且

提前致谢,

【问题讨论】:

    标签: computer-vision


    【解决方案1】:

    很难准确地回答你的问题,因为你没有具体提到你是如何计算 arctan 函数的。

    例如,如果您使用的是standard library's atan function,则预期会出现负角。

    此外,您会注意到带有单个参数的 atan 只能返回第一和第四象限中的值(因为,例如,tan 45 == tan 225 使用度数时)。

    如果您真的想在四个象限之一中找到一个角度(您真的应该问问自己这对您的应用程序是否重要),请查看atan2

    【讨论】:

    • 根据我一直在查看的文档 (uweb.ucsb.edu/~shahnam/AfED.doc),我使用的是 Y 方向的 sobel 内核的总和值(我的示例中的 Gy)和X 方向的 sobel 核(我的示例中的 Gx)。我已经看到其他一些推荐 arctan2(Gy, Gx) 来计算这些值的地方,而且我也得到了负角。 @misha,感谢您对象限结果的帮助,完全正确!对于我的应用程序,四边形检测,4 个象限可能效果最好。
    【解决方案2】:

    如果您使用的是 OpenCV、C++,您可以执行以下操作:

        Mat gray = some grayscale image;
    

    计算 x/y 轴上的边缘梯度'

        Mat dx(gray.rows, gray.cols, CV_16SC1);
        Mat dy(gray.rows, gray.cols, CV_16SC1);
        int aperture_size=3;
        Sobel(gray, dx, CV_32FC1, 1, 0, aperture_size, 1, 0, BORDER_REPLICATE);
        Sobel(gray, dy, CV_32FC1, 0, 1, aperture_size, 1, 0, BORDER_REPLICATE);
    

    使用 OpenCV 的 cartToPolar 计算角度和大小

        Mat Mag(gray.size(), CV_32FC1);
        Mat Angle(gray.size(), CV_32FC1);
        cartToPolar(dx, dy, Mag, Angle, true);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-25
      • 2021-06-02
      • 2020-04-06
      • 1970-01-01
      • 2017-04-22
      • 2016-11-07
      • 2018-12-12
      • 2015-08-09
      相关资源
      最近更新 更多