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 КиБ) Просмотров: 4270


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

Добавлено спустя 1 час 37 минут:
можно на этой картинке объяснить:
1.jpg
1.jpg (29.34 КиБ) Просмотров: 4255
«Сон разума рождает чудовищ»
Аватара пользователя
Zeus
 
Сообщения: 857
Зарегистрирован: 28 июл 2009, 10:02
Откуда: Самара
ФИО: Павел Сергеевич

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

Сообщение Duhas » 03 сен 2012, 17:32

ну я с налету попробую.. есть такое понятие, апертура - область в которой будем работать, относительно текущего пикселя, в зависимости от ее размера (3х3, 5х5, и т.д.) у нас будет появляться больше возможных углов.. а вот как считать градиент для апертуры больше 3х3 нужно подумать или нагуглить.. вариантов на мой взгляд два: либо берем разности для каждой пары 'целевой пиксель'-'другой пиксель из апертуры', либо высчитываем через общий градиент апертуры.. т.к. у целевого пикселя могут быть очень черные ближние соседи и очень белые соседи через одного, в частности и по диагонали. в догонку предположу, что можно прогонять по апертуре медианную фильтрацию.
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6341
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

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

Сообщение Angel71 » 03 сен 2012, 17:48

в вике есть описание оператор собеля + внизу ещё несколько ссылок (одна из). оно?
Аватара пользователя
Angel71
 
Сообщения: 9231
Зарегистрирован: 18 апр 2009, 22:18
Предупреждения: -1

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

Сообщение Zeus » 03 сен 2012, 18:43

Да, вроде оно.
Спасибо огромное.
Буду разбираться...
«Сон разума рождает чудовищ»
Аватара пользователя
Zeus
 
Сообщения: 857
Зарегистрирован: 28 июл 2009, 10:02
Откуда: Самара
ФИО: Павел Сергеевич

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

Сообщение Duhas » 03 сен 2012, 22:23

ну или пропроще - оператор робертса )
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6341
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

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

Сообщение noonv » 04 сен 2012, 01:51

Аватара пользователя
noonv
 
Сообщения: 586
Зарегистрирован: 21 май 2007, 22:57
Откуда: Калининград
прог. языки: C++

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

Сообщение Zeus » 04 сен 2012, 16:34

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

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

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

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

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 КиБ) Просмотров: 4037

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 КиБ) Просмотров: 4035

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

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

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

Как перевести в нормальные 360 градусов?
«Сон разума рождает чудовищ»
Аватара пользователя
Zeus
 
Сообщения: 857
Зарегистрирован: 28 июл 2009, 10:02
Откуда: Самара
ФИО: Павел Сергеевич

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

Сообщение boez » 04 сен 2012, 16:51

Если Gy<0, то к полученному значению арктангенса добавить 180 градусов. Получишь полноценный угол в диапазоне от -90 до 270. Если минусы напрягают - в случае минуса добавь 360.
boez
 
Сообщения: 1974
Зарегистрирован: 27 авг 2008, 10:45
Откуда: Харьков
прог. языки: С/С++

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, а иначе направление может повернуться из-за учета четвертей, наверное.
«Сон разума рождает чудовищ»
Аватара пользователя
Zeus
 
Сообщения: 857
Зарегистрирован: 28 июл 2009, 10:02
Откуда: Самара
ФИО: Павел Сергеевич

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

Сообщение boez » 04 сен 2012, 22:18

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

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

Поищи алгоритм вычисления аргумента комплексного числа - там ровно та же задача.
boez
 
Сообщения: 1974
Зарегистрирован: 27 авг 2008, 10:45
Откуда: Харьков
прог. языки: С/С++

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.
Сейчас проверил - и в екселе, и в С++ такая функция уже есть :) так что буду ее использовать и проверку делать сам не буду.
«Сон разума рождает чудовищ»
Аватара пользователя
Zeus
 
Сообщения: 857
Зарегистрирован: 28 июл 2009, 10:02
Откуда: Самара
ФИО: Павел Сергеевич


Вернуться в Компьютерное зрение

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Mail.ru counter