Из ссылок выше я понял, что вычисляются «приближенные» «производные» по оси Х (по строчкам) – Gx, по оси Y (по столбцам) – Gy.
Задача: «В точке Р22 найти градиент яркости, т.е. его направление и величину.»
Вложение:
Задача.png [ 1021 байт | Просмотров: 9356 ]
Берем 3х3 пикселей.
Раньше я предположил, что надо найти разницу между центром и пикселями вокруг него и выбрать максимум, но ведь максимумы могут быть сразу в нескольких направлениях.
Оператор Собеля получается не учитывается не только центр, но и соседние пиксели по столбцам или строкам в зависимости от того какую «производную» находят.
«Производная» по оси Х (по строчкам) – Gx находится «свертыванием», звучит странно, а на деле получается следующее:
Вложение:
ОсьХ.png [ 2.05 КиБ | Просмотров: 9363 ]
Gx = Р11*-1 + Р12*0 + Р13*1 + Р21*-2 + Р22*0 + Р23*2 + Р31*-1 + Р32*0 + Р33*1
По идее если убрать все лишнее, то получится
Gx = Р11*-1 + Р13*1 + Р21*-2 + Р23*2 + Р31*-1 + Р33*1
Gx = - Р11 + Р13 + -2*Р21 + 2*Р23 - Р31 + Р33
Gx = 1*(Р13 - Р11) + 2*(Р23 - Р21) + 1*(Р33 - Р31)
Например, берем первую строчку пикселей. Применяем к ней ось Х, т.е. за (0) точку отсчета берем Р12, соответственно влево идет минус, вправо идет плюс, по идее яркость должна нарастать слева направо, если будет наоборот, то результат получится со знаком минус. И так со второй и третьей строкой.
Я так понял, что находим разницы первой, второй и третьей строчки построчно
Р13-Р11, Р23-Р21, Р33-Р31. Далее эти построчные разницы умножаются на соответствующие коэффициенты и складываются между собой, получается число Gx.
Почему выбраны коэффициенты 1, 2, 1 не знаю. Скорее всего, это типа весовые коэффициенты влияния.
Для столбцов, получится так
Вложение:
Gy.png [ 1.71 КиБ | Просмотров: 9363 ]
Gy = Р11*-1 + Р12*-2 + Р13*-1 + Р21*0 + Р22*0 + Р23*0 + Р31*1 + Р32*2 + Р33*1
Gy = -Р11 -2*Р12 - Р13 + Р31 + 2*Р32 + Р33
Gy = 1*(Р31-Р11) + 2*(Р32-Р12) + 1*(Р33-Р13)
Для Gy так же находятся разницы, но по столбцам, Р31-Р11, Р32-Р12, Р33-Р13 (подразумевается что яркость должна увеличиваться сверху вниз по столбцу). И опять разницы умножаются на коэффициенты 1, 2, 1 и складываются между собой. Получаем число Gy.
Теперь вроде направление градиента, точнее угол можно вычислить по формуле:
alfa=arctan(Gy/Gx)
Но вот незадача, угол от арктангенса получается в диапазоне от (-90)-(0)-(+90), т.е. всего 180 гр – «полоборота», а если считать только + то всего 90 град.
Вот пример, того как углы одинаковые получаются, хотя направления по идее разные.
По столбцам перевернул оператор, сделал увеличение яркости снизу вверх, так как ось Y в прямоугольных координатах стандартно идет снизу вверх.
45градусов
Вложение:
++.png [ 8.85 КиБ | Просмотров: 9349 ]
другие 45 градусов
Вложение:
--.png [ 8.88 КиБ | Просмотров: 9363 ]
-45градусов
Вложение:
-+.png [ 8.66 КиБ | Просмотров: 9379 ]
другие -45градусов
Вложение:
+-.png [ 8.5 КиБ | Просмотров: 9387 ]
Как перевести в нормальные 360 градусов?