Sobel边缘检测,边缘定位

时间:2011-09-13 16:25:26

标签: computer-vision

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

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

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

其中Gx是Sobel核心在X方向上的卷积的总和,而Gy是Sobel核心在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,则θ= 90
  • 否则,theta =(arctan(Gy / Gx)* 180)/ PI

我的所有文档都告诉我角度应该是> 0和< 360和我继续获得负值方向的边缘。在计算theta或我的卷积时,有什么我做错了吗?或者我应该将负值θ值加上360或180?

提前感谢,

2 个答案:

答案 0 :(得分:3)

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

例如,如果您使用的是standard library's atan function,那么就会出现负角度。

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

如果你真的想要在四个象限中的一个角度(你应该问自己这对你的应用是否重要),那么看看atan2

答案 1 :(得分:0)

如果您使用的是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);