Геометрические преобразования изображений
Nov. 25th, 2011 01:41 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Вращение вокруг начала координат
Итак, начнем с простейшего случая. Пусть мы имеем некий набор точек, расстояния между которыми постоянны (т.е. проще представить это в виде некоторого "жесткого" объекта). Каждая точка Pi задана координатами (xi, yi). Координаты точек будем обозначать в векторном виде: ri Повернем наш набор точек вокруг начала координат на некоторый угол: Каждая точка Pi, заданная вектором ri, переходит путем преобразования вращения в точку P'i, заданную вектором r'i. Чтобы записать это преобразование в матричном виде, дополним вектора-столбцы, характеризующие каждую точку, единицей, а матрицу преобразования координат: сделаем квадратной, заполнив недостающие элементы нулями, а правый нижний элемент главной диагонали - единицей: Тогда получим в общем виде: r' = Rr, где R - матрица поворота: Это уравнение легко решается методом наименьших квадратов, в результате чего определяется угол поворота системы.Вращение вокруг начала координат и сдвиг
Теперь рассмотрим вращение вокруг начала координат, после которого происходит сдвиг всех точек на вектор сдвига T: Математически это означает то, что после умножения изначальных векторов ri на матрицу поворота необходимо будет еще прибавить к каждому вектор T: r'i = Rri + T, или r'i = Mri, где M=R·Mt - матрица преобразования в данном случае является произведением матрицы вращения на матрицу смещения: В результате решения системы r'i = Mri мы получим матрицу преобразования, из которой однозначно можно определить как угол поворота, так и вектор смещения.Вращение вокруг произвольной точки
Выберем теперь произвольную точку М (не начало координат) и будем вращать нашу систему точек вокруг нее: С геометрической точки зрения это преобразование эквивалентно совокупности следующих: сдвиг на вектор MO, поворот и сдвиг обратно на вектор OM. В матричном представлении матрица преобразования будет иметь вид: M = T·R·T-1, индексом "-1" мы обозначили операцию перемещения в противоположную сторону (не забываем, что последовательность геометрических преобразований читается справа-налево, т.е. сначала - смещение на -T, затем поворот, а затем смещение обратно).Чтобы не писать все эти синусы и косинусы целиком, обозначим синус угла поворота буквой s, а косинус - буквой c. Тогда после умножения матриц, получим:
Итак, в данном случае угол вращения находится элементарно (например, методом наименьших квадратов или просто усреднением), а затем, решая систуму уравнений справа, получим значение вектора смещения, т.е. координаты центра вращения: (т.к. здесь возможны случаи обращения знаменателя в ноль, необходимо обязательно выполнять проверку).Сдвиг и вращение вокруг произвольной точки
Ну а теперь перейдем к самому общему случаю: вращению вокруг произвольного центра со сдвигом: Теперь к произведению матриц слева необходимо добавить еще один сдвиг (на вектор MM'). После выполнения умножения мы получим ту же самую матрицу, что получили в предыдущем пункте, но смещение теперь будет суммарным, как если бы мы вращали объект вокруг нового центра, который получается путем смещения оригинального центра вращения на вектор MM'.Решая аналогичную предыдущему пункту систему уравнений, получим значение угла поворота и сумму радиус-вектора центра вращения и вектора смещения изображения. Если анализировать большое количество изображений, для которых смещения являются небольшими и случайными, а центр вращения остается в одном и том же месте, то, например, медианным усреднением набора полученных векторов можно определить радиус-вектор центра вращения, близкий к реальному с точностью, которая будет тем лучше, чем больше наблюдений мы сделали и чем выше точность определения координат объектов.
Ну, а в следующей заметке я попытаюсь применить изложенное для автоматического определения центра вращения поля и его смещения от кадра к кадру.