roboforum.ru

Технический форум по робототехнике.

Градиент пикселя

Градиент пикселя

Zeus » 03 сен 2012, 17:25

Существует такое понятие как «Градиент изображения – направление максимального изменения яркости изображения».
Во многих статьях пишут: «Вычислим градиенты в каждом пикселе...».
Градиент - вектор (угол-направление и длина-скорость нарастания величины).
Вроде так по общечеловеческим понятиям ясно, даже есть функции в опенцв, но хотелось бы разобраться более предметно к изображению, к пикселям, так как минимальное приращение 1 пиксель.

Например, имеем изображение в оттенках серого, например 10х10 точек – (y,x).
Берем точку P11(1,1). Как вычислить градиент в данном пикселе?

Если брать все точки вокруг выбранной Р11-«центр», то будет всего 8 точек – 8 направлений. По каждому направлению можно вычислить разницу между яркостями пикселей. И что с этим дальше делать? Выбрать максимальную разницу(самая большая скорость нарастания) и это направление? При таком подходе углы получаются уже фиксированные по 45 градусов, но во многих примерах углы получаются различные во всем диапазоне от 0 до 360 гр.
1.jpg
1.jpg (12.35 КиБ) Просмотров: 9280


Я не математик, поэтому прошу попроще объяснить.

Добавлено спустя 1 час 37 минут:
можно на этой картинке объяснить:
1.jpg
1.jpg (29.34 КиБ) Просмотров: 9267

Re: Градиент пикселя

Duhas » 03 сен 2012, 17:32

ну я с налету попробую.. есть такое понятие, апертура - область в которой будем работать, относительно текущего пикселя, в зависимости от ее размера (3х3, 5х5, и т.д.) у нас будет появляться больше возможных углов.. а вот как считать градиент для апертуры больше 3х3 нужно подумать или нагуглить.. вариантов на мой взгляд два: либо берем разности для каждой пары 'целевой пиксель'-'другой пиксель из апертуры', либо высчитываем через общий градиент апертуры.. т.к. у целевого пикселя могут быть очень черные ближние соседи и очень белые соседи через одного, в частности и по диагонали. в догонку предположу, что можно прогонять по апертуре медианную фильтрацию.

Re: Градиент пикселя

Angel71 » 03 сен 2012, 17:48

в вике есть описание оператор собеля + внизу ещё несколько ссылок (одна из). оно?

Re: Градиент пикселя

Zeus » 03 сен 2012, 18:43

Да, вроде оно.
Спасибо огромное.
Буду разбираться...

Re: Градиент пикселя

Duhas » 03 сен 2012, 22:23

ну или пропроще - оператор робертса )

Re: Градиент пикселя

noonv » 04 сен 2012, 01:51


Re: Градиент пикселя

Zeus » 04 сен 2012, 16:34

Из ссылок выше я понял, что вычисляются «приближенные» «производные» по оси Х (по строчкам) – Gx, по оси Y (по столбцам) – Gy.

Задача: «В точке Р22 найти градиент яркости, т.е. его направление и величину.»
Задача.png
Задача.png (1021 байт) Просмотров: 9031

Берем 3х3 пикселей.
Раньше я предположил, что надо найти разницу между центром и пикселями вокруг него и выбрать максимум, но ведь максимумы могут быть сразу в нескольких направлениях.
Оператор Собеля получается не учитывается не только центр, но и соседние пиксели по столбцам или строкам в зависимости от того какую «производную» находят.

«Производная» по оси Х (по строчкам) – Gx находится «свертыванием», звучит странно, а на деле получается следующее:
ОсьХ.png
ОсьХ.png (2.05 КиБ) Просмотров: 9039

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
Gy.png (1.71 КиБ) Просмотров: 9037

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
++.png (8.85 КиБ) Просмотров: 9025

другие 45 градусов
--.png
--.png (8.88 КиБ) Просмотров: 9037

-45градусов
-+.png
-+.png (8.66 КиБ) Просмотров: 9053

другие -45градусов
+-.png
+-.png (8.5 КиБ) Просмотров: 9063

Как перевести в нормальные 360 градусов?

Re: Градиент пикселя

boez » 04 сен 2012, 16:51

Если Gy<0, то к полученному значению арктангенса добавить 180 градусов. Получишь полноценный угол в диапазоне от -90 до 270. Если минусы напрягают - в случае минуса добавь 360.

Re: Градиент пикселя

Zeus » 04 сен 2012, 19:31

С проверкой идею понял.
Вот только наверное одним условием не обойдешься...
На вскидку уже три приходит.
Если брать углы от 0 до 360 от положительной части оси ОХ против часовой стрелки, то добавочный угол:
если Gx>0 и Gy>0, то первая четверть +0
если Gx<0 , то вторая или третья четверть +180
если Gx>0 и Gy<0, то четвертая четверть +360

Первая четверть - углы (+) прибавляем доб. угол - от 0 до 90 гр.
Вторая четверть - углы (-) прибавляем доб. угол - от 90 до 180 гр.
Третья четверть - углы (+) прибавляем доб. угол - от 180 до 270 гр.
Четвертая четверть - углы (-) прибавляем доб. угол - от 270 до 360 гр.

Еще получается, что при Gx=0 - деление на ноль возникает, а вот сделать его Gx= -1 или Gx= +1 вопрос, опять доп. проверки нужны причем с учетом Gy, а иначе направление может повернуться из-за учета четвертей, наверное.

Re: Градиент пикселя

boez » 04 сен 2012, 22:18

Так я тебе ровно то же и написал. считаем арктангенс, он от -90 до +90. Если Gy<0 - добавляем 180. Если в итоге получен угол меньше нуля - добавляем 360, причем это необязательно по сути.

С нулем Gx - вообще отдельная ветка, до деления, никаких арктангенсов - сразу выдаем 90 или 270 в зависимости от знака Gy.

Поищи алгоритм вычисления аргумента комплексного числа - там ровно та же задача.

Re: Градиент пикселя

Zeus » 05 сен 2012, 13:26

Все, разобрался.
Полярная система координат:
http://ru.wikipedia.org/wiki/%CF%EE%EB% ... 8%ED%E0%F2
Конкретно - "Связь между декартовыми и полярными координатами" - там как раз куча условий для вычисления угла арктангенсами в определенном диапазоне.
А еще вот чего там написано:
"Учитывая, что для вычисления полярного угла не достаточно знать отношение y к x, а ещё нужны знаки одного из этих чисел, многие из современных языков программирования имеют среди своих функций помимо функции atan, определяющей арктангенс числа, ещё и дополнительную функцию atan2, которая имеет отдельные аргументы для числителя и знаменателя"

atan2 дает угол от -PI до +PI, исключая -PI.
Сейчас проверил - и в екселе, и в С++ такая функция уже есть :) так что буду ее использовать и проверку делать сам не буду.

Re: Градиент пикселя

Taurika » 01 сен 2019, 00:37

Вообще не так сложно вычислять арксинус. В тригонометрии угол определяется по дуге, вырезаемой углом из окружности. При этом имеет значение положение угла в отношении оси Ox. Если он откладывается по часовой стрелке, его называют положительным, если против - отрицательным. При отсчете угла возможно сделать любое число оборотов вокруг точки 0. Следовательно - величина угла на практике может быть любым действительным числом.


Rambler\'s Top100 Mail.ru counter