roboforum.ru

Технический форум по робототехнике.
Текущее время: 17 фев 2025, 08:01

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
 Заголовок сообщения: Градиент пикселя
СообщениеДобавлено: 03 сен 2012, 17:25 
Не в сети
Аватара пользователя

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

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

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


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

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

_________________
«Сон разума рождает чудовищ»


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Градиент пикселя
СообщениеДобавлено: 03 сен 2012, 17:32 
Не в сети
Аватара пользователя

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

_________________
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Градиент пикселя
СообщениеДобавлено: 03 сен 2012, 17:48 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Градиент пикселя
СообщениеДобавлено: 03 сен 2012, 18:43 
Не в сети
Аватара пользователя

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

_________________
«Сон разума рождает чудовищ»


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Градиент пикселя
СообщениеДобавлено: 03 сен 2012, 22:23 
Не в сети
Аватара пользователя

Зарегистрирован: 15 сен 2007, 13:03
Сообщения: 6338
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович
ну или пропроще - оператор робертса )

_________________
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Градиент пикселя
СообщениеДобавлено: 04 сен 2012, 01:51 
Не в сети
Аватара пользователя

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

_________________
RoboCraft.ru


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Градиент пикселя
СообщениеДобавлено: 04 сен 2012, 16:34 
Не в сети
Аватара пользователя

Зарегистрирован: 28 июл 2009, 10:02
Сообщения: 862
Откуда: Самара
ФИО: Павел Сергеевич
Из ссылок выше я понял, что вычисляются «приближенные» «производные» по оси Х (по строчкам) – Gx, по оси Y (по столбцам) – Gy.

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

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

«Производная» по оси Х (по строчкам) – Gx находится «свертыванием», звучит странно, а на деле получается следующее:
Вложение:
ОсьХ.png
ОсьХ.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
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
++.png [ 8.85 КиБ | Просмотров: 9349 ]

другие 45 градусов
Вложение:
--.png
--.png [ 8.88 КиБ | Просмотров: 9363 ]

-45градусов
Вложение:
-+.png
-+.png [ 8.66 КиБ | Просмотров: 9379 ]

другие -45градусов
Вложение:
+-.png
+-.png [ 8.5 КиБ | Просмотров: 9387 ]

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

_________________
«Сон разума рождает чудовищ»


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Градиент пикселя
СообщениеДобавлено: 04 сен 2012, 16:51 
Не в сети

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Градиент пикселя
СообщениеДобавлено: 04 сен 2012, 19:31 
Не в сети
Аватара пользователя

Зарегистрирован: 28 июл 2009, 10:02
Сообщения: 862
Откуда: Самара
ФИО: Павел Сергеевич
С проверкой идею понял.
Вот только наверное одним условием не обойдешься...
На вскидку уже три приходит.
Если брать углы от 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: Градиент пикселя
СообщениеДобавлено: 04 сен 2012, 22:18 
Не в сети

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Градиент пикселя
СообщениеДобавлено: 05 сен 2012, 13:26 
Не в сети
Аватара пользователя

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

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

_________________
«Сон разума рождает чудовищ»


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Градиент пикселя
СообщениеДобавлено: 01 сен 2019, 00:37 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Часовой пояс: UTC + 4 часа


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

Сейчас этот форум просматривают: Yandex [Bot] и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO