Аффинное преобразование растра
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [18.97.9.174] |
|
|
правила раздела Алгоритмы

Аффинное преобразование растра
|
Сообщ.
#1
,
|
|
|
|
Привет!
Имеется растровая картинка (прямоугольная) в виде массива точек {r, g, b}, имеется матрица преобразования из одной системы координат в другую {a00, a01, a10, a11} с детерминантом = 1. Необходимо исходный растр преобразовать с помощью данной матрицы преобразования. Преобразование не может быть сведено к повороту и сдвигу - оно вообще говоря может быть любым, но его матрица имеет единичный детерминант. Подскажите, если знаете, алгоритм, или хотя бы в какую сторону смотреть. Поисковики пока не помогли. Может для подобного преобразования растра есть какое-то название, типа, морфинг или еще какое? Скорость алгоритма значения не имеет, важна максимальная точность (без потери деталей и без появления артефактов). Естественно, что после преобразования исходная картинка не будет уже прямоугольником с горизонтальными и вертикальными сторонами, но мы ее "впишем" в такой прямоугольник, залив пустые области черным цветом. Буду благодарен любым подсказкам и намекам. С уважением, Иван Борунов. |
|
Сообщ.
#2
,
|
|
|
|
ИМХО, если
Цитата borunov, 12.09.03, 21:36:19 важна максимальная точность (без потери деталей и без появления артефактов). , то надо в исходном растре "увеличить разрешение" больше чем в max{|lambdai|} раз, где lambdai -- собственные числа матрицы. (Разбить каждый пиксель на несколько частей по горизонтали и вертикали и преобразовывать их отдельно. Потом все ети кусочки пикселей, попавшие в один пиксель результирующего изображения, усреднить...) |
|
Сообщ.
#3
,
|
|
|
|
Считаем обратную матрицу - т.е. обратное аффинное преобразование, и для каждой точки нового растра находим соответствующую ей точку исходного. Для улучшения качества (при существенном изменении размера) можно применять интерполяцию (билинейную, квадратичную, сплайновую)- каждая составляющая цвета рассчитывается не по одной точке исходного, а по окрестности.
|
|
Сообщ.
#4
,
|
|
|
|
Про то, что надо разбивать пиксели на субпиксели, я сообразил, но не знал, как оценить, на сколько кусочков бить каждый пиксель. Спасибо за подсказку про собственные числа матрицы - попробую.
|
|
Сообщ.
#5
,
|
|
|
|
Если детерминант = 1, то преобразование можно представить в виде композиции перемещения и сдвига. Сдвиг вдоль горизонтальной оси делается без потери информации. Осталось качественно повернуть, что и есть самое трудное.
|
|
Сообщ.
#6
,
|
|
|
|
Тут, видимо должно было быть "композиции сжатия/растяжения и поворота"?
Сдвиг (+ костанта к координатам преобразуемого вектора), насколько я помню, делается с помощью увеличения размерности оператора преобразования (вводится дополнительная строка в той матрице). |
|
Сообщ.
#7
,
|
|
|
|
Цитата Visitor, 15.09.03, 13:06:44 Тут, видимо должно было быть "композиции сжатия/растяжения и поворота"? Сдвиг (+ костанта к координатам преобразуемого вектора), насколько я помню, делается с помощью увеличения размерности оператора преобразования (вводится дополнительная строка в той матрице). Сдвиг - это такая деформация, описываемая матрицей 1 k 0 1 Пожалуй при сдвиге будут таки артефакты. |
|
Сообщ.
#8
,
|
|
|
|
Т.е., под сдвигом понимается ето: | | -> / / ?
|
|
Сообщ.
#9
,
|
|
|
|
Цитата Visitor, 15.09.03, 16:45:27 Т.е., под сдвигом понимается ето: | | -> / / ? Да |