Sobel Edge Detection, ориентация края - PullRequest
       2

Sobel Edge Detection, ориентация края

1 голос
/ 13 сентября 2011

Я реализовал Sobel Edge Detector и у меня возникли некоторые вопросы по поводу вычисления ориентации краев.

Я использую эту функцию для вычисления интенсивности краев после свертки ядра sobel.

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

Где Gx - сумма свертки для ядра sobel в направлении X, а Gy - сумма свертки для ядра sobel в направлении Y. (обратите внимание, что ядро ​​sobel в направлении X и Y - это разные ядра)

Y ядро:

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

X ядро:

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

когда я пытаюсь вычислить ориентацию края (тета в градусах), я использую следующие правила:

  • если Gy == 0 и Gx == 0, то тета = 0
  • если Gy! = 0 и Gx == 0, то тета = 90
  • в противном случае, тета = (арктан (Гр / Гх) * 180) / PI

вся моя документация говорит мне, что углы должны быть> 0 и <360, и я продолжаю получать ребра с ориентацией отрицательных значений. Есть ли что-то, что я делаю неправильно при вычислении тэты или моей свертки? Или мне просто добавить 360 или 180 к отрицательным значениям тета? </p>

заранее спасибо,

Ответы [ 2 ]

3 голосов
/ 13 сентября 2011

Трудно ответить на ваш вопрос именно потому, что вы не упомянули, как именно вы рассчитываете функцию арктана.

Например, если вы используете функцию atan стандартной библиотеки , то следует ожидать отрицательных углов.

Кроме того, вы заметите, что atan с одним аргументом может когда-либо возвращать значения только в первом и четвертом квадрантах (например, tan 45 == tan 225 при использовании градусов).

Если вам действительно нужен угол в одном из четырех квадрантов (вы должны спросить себя, имеет ли это значение для вашего приложения), тогда взгляните на atan2 .

0 голосов
/ 19 ноября 2015

Если вы используете 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);
...