Где найти алгоритмы искажения изображения? Существует так много информации о Blur и других классических алгоритмах, но так мало о более сложных. В частности, меня интересует алгоритм искажения изображения с эффектом завихрения.
Ресурсы по алгоритмам искажения изображения
Ответы (5)
Я не могу найти никаких ссылок, но я могу дать общее представление о том, как работают эффекты искажения.
Ключом к искажению является функция, которая берет две координаты (x, y) искаженного изображения и преобразует их в координаты (u, v) исходного изображения. Это определяет обратную функцию искажения, поскольку возвращает искаженное изображение к исходному изображению.
Чтобы сгенерировать искаженное изображение, нужно выполнить цикл по x и y, вычислить точку (u, v) по (x, y) с помощью функции обратного искажения и установить компоненты цвета в (x, y) такими же, как те. в (u, v) на исходном изображении. Обычно используется интерполяция (например, http://en.wikipedia.org/wiki/Bilinear_interpolation ) для определить цвет в точке (u,v), так как (u,v) обычно лежит не точно в центре пикселя, а в некоторой дробной точке между пикселями.
Вихрь — это, по сути, вращение, угол поворота которого зависит от расстояния от центра изображения. Примером может быть:
a = amount of rotation
b = size of effect
angle = a*exp(-(x*x+y*y)/(b*b))
u = cos(angle)*x + sin(angle)*y
v = -sin(angle)*x + cos(angle)*y
Здесь для простоты я предполагаю, что центр завихрения находится в точке (0,0). Завихрение можно разместить где угодно, вычитая координаты положения завихрения из x и y перед функцией искажения и добавляя их к u и v после нее.
Существуют различные эффекты завихрения: некоторые (например, приведенные выше) закручивают только локализованную область, а степень завихрения уменьшается к краю изображения. Другие увеличивают завихрение к краю изображения. Такого рода вещи можно сделать, играя с линией angle =, например.
angle = a*(x*x+y*y)
На Jerry's Java Image Filters. Может быть, вы можете черпать оттуда вдохновение.
Завихрение и тому подобное — это матричное преобразование расположения пикселей. Вы создаете новое изображение и получаете цвет из позиции на изображении, полученной путем умножения текущей позиции на матрицу.
Матрица зависит от текущей позиции.
вот хороший CodeProject, показывающий, как это сделать
http://www.codeproject.com/KB/GDI-plus/displacementfilters.aspx
есть новая графическая библиотека с множеством функций
http://code.google.com/p/picasso-graphic/
Взгляните на ImageMagick. Это набор инструментов для преобразования и редактирования изображений с интерфейсами для всех популярных языков.
Оператор -displace может создавать завихрения с правильной картой смещения.
Если вас по какой-то причине не устраивает интерфейс ImageMagick, вы всегда можете взглянуть на исходный код фильтров и перейти оттуда.