|
|
|
asmworm |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 55 Регистрация: 20.1.2004 Репутация: 1 Всего: 1 |
Всем привет
Столкнулся с такой проблемой: надо сделать преобразование изображения с эффектом Twirl(в фотошопе, или Whirl в GIMP) Скиньте плиз алгоритм такого преобразования. Я в нэте нашёл только исходники.... И разжуйте плз как после преобразования делать наложение изображения |
|||
|
||||
SoWa |
|
|||
Харекришна Профиль Группа: Комодератор Сообщений: 2422 Регистрация: 18.10.2004 Репутация: 6 Всего: 74 |
Каждый пиксель изображения очевидно поворачиваешь относительно центра картинки. Делишь картинку на линии толщиной в одну точку. И каждая точка более удаленная от центра вращается на больший градус.
-------------------- Всем добра |
|||
|
||||
asmworm |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 55 Регистрация: 20.1.2004 Репутация: 1 Всего: 1 |
Наоборот на меньший градус. Но тут много нюансов, и хотелось бы услышать более конкретные выкладки, тобишь конкретный алгоритм |
|||
|
||||
NewDima |
|
|||
Опытный Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: нет Всего: 12 |
Выбираешь центр Twirl(хватаешь [x, y])
Потом радиус-вектором рошагиваеш по каждому пикселу, ватаешь его цвет, в зависимости от того, как далеко он от [x, y], поворачиваешь на угол. Здесь чем больше расстояние от [x, y], тем меньшее перемещение по окружности этого пиксила с центром в [x, y]. Слушай, алгоритм простой, здесь писанина. На чем пишешь? Добавлено @ 10:51 Забыл напомнить, чтобы предыдущий рисунок загонял в буфер, и с него считывал, а заносил например на экран, или в другой буфер... удачи! Добавлено @ 10:57 Если быть конкретнее, то можно прошагивать по cos и sin но здесь может быть накладка, из-за погрешности могут получиться пропущенные пикселы. Тогда лучше прошагивать все точки, и смотреть, удовлетворяют ли они уравнению окружности от TWIRL. Затем смотришь расстояние от [x, y] и в соответственно установленном тобой масштабе сдвигаешь пиксел по окружности, я типа такого делал, но Исхв не осталось. |
|||
|
||||
asmworm |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 55 Регистрация: 20.1.2004 Репутация: 1 Всего: 1 |
А как быть с наложением пиксела в финальный буфер? Я так подозреваю что там должно быть какое-то усреднение, а то если без него то в итоге эффект получится зернистый.Просто посмотрел исходники GIMP ? ,там идёт усреднение. Только по какому буферу усреднять? Брать пикселы из исходного или финального? Просто ,как бы, если в финальный, то по идее если он залит черным цветом тогда интенсивность цвета пиксела, допустим на 1 шаге(тоесть 1 пиксела) резко упадёт. Если смешивать с исходным то тоже гамазня какаето получится.Или финальный буфер должен быть прозрачным? П.С. пишу на С++ только вроде писанины стокоже , поэтому можно и в псевдокоде, я пойму Это сообщение отредактировал(а) asmworm - 10.3.2006, 20:04 |
|||
|
||||
Kostt |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 169 Регистрация: 8.1.2006 Где: Томск Репутация: нет Всего: 3 |
Понятное дело, надо усреднять по нескольким соседним пикселям. См. теорию компьютерную графики ( билинейная, трилинейная интерполяция и т.п.)
|
|||
|
||||
asmworm |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 55 Регистрация: 20.1.2004 Репутация: 1 Всего: 1 |
Вопрос собсно состоял так: по какому буферу надо усреднять, и каким должен быть финальный буфер если усреднять по нему |
|||
|
||||
NewDima |
|
|||
Опытный Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: нет Всего: 12 |
Финальный буфер делай прозрачным. Получается так, бирешь с исходника, кладешь в другой буфер преобразованное. Причем, если пиксель, который берешь, не входит в окружность твирла, то его кладешь без изменений.
Удачи |
|||
|
||||
asmworm |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 55 Регистрация: 20.1.2004 Репутация: 1 Всего: 1 |
Ну тогда алгоритм я понял так: Выбираем центр x,y Выбираем радиус преобразования R Вибираем угол преобразования A Преобразование состоит в следующем: есть ф-ция f(_r) которая возвращает угол в зависимости от текущего радиуса который принадлежит промежутку [0;R]. Проводим преобразование по всему входному буферу при этом в финальном буфере делая усреднение по каждой преобразованной точке... f(_r) - я так понимаю линейная ф-ция, ну мне так показалось после того как я заглянул в фотошоп, и f(_R)=0 , f(0+)"A. И радиус там выбирается таким образом: он делает преобразование не по окружности а по элипсу так что большая и малая полуось это половина соотвествующей стороны прямоугольника изображения. Я всё правильно понял? Это сообщение отредактировал(а) asmworm - 11.3.2006, 12:03 |
|||
|
||||
NewDima |
|
||||
Опытный Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: нет Всего: 12 |
Все то все, только вот если по твоей логике судить, что преобразования проходят по эллипсу, то значит, что если рименить к изображению фильтр, то его наибольшее из измерений может измениться. На практике я этого не наблюдал.
область обрабатываемого изображения Всегда получается квадратом, а это значит, что малая и большая полуоси - равны, а значит это окружность.
Если ты хочешь как можно точнее приблизить филтр к фотошопному, то нужно не заглядывать, а посиди порассматривай. Я минут 30 сейчас сидел эксперементировал. Код (сырой, но исполняющий) написал на паскале в течение 20 минут. Пиши |
||||
|
|||||
asmworm |
|
||||
Шустрый Профиль Группа: Участник Сообщений: 55 Регистрация: 20.1.2004 Репутация: 1 Всего: 1 |
Интерестно как это так он(фотошоп) применяет фильтр по окружности в прямоугольном изображении , кто не верит может сам заглянуть - там получается эллипс. А то что в алгоритме не эллипс я то догадался Ладно, вобщем я понял, спасибо |
||||
|
|||||
NewDima |
|
|||
Опытный Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: нет Всего: 12 |
Ну понял, молодец, только не цетирую фразы целиком
|
|||
|
||||
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |