MATLAB вычисляет угол поворота

У меня 5 точек на окружности:.........1
................................. ....... ........ 2 ...... . 3

                      4     5

Теперь у меня есть его повернутое изображение: ..............

.............................................................1. .......3

                           2          5

                             4        

Примечание: точки не нумеруются.

В основном у меня есть 5 наборов координат, которые при построении выглядят как на изображении ниже.

Мне нужно рассчитать величину, на которую я должен наклонить изображение, чтобы оно выглядело как изображение выше.


person user1471216    schedule 21.06.2012    source источник
comment
@Andrey: Только поворот. и я не знаю координат (xt,yt). Я просто знаю, что координаты при вращении должны выглядеть как на изображении выше.   -  person user1471216    schedule 21.06.2012
comment
В этом случае следует начать с нахождения координат некоторых точек на входе и выходе.   -  person Andrey Rubshtein    schedule 21.06.2012
comment
Ваши данные представляют собой изображение или набор точек?   -  person reve_etrange    schedule 21.06.2012
comment
Мои данные - это координаты набора точек. 2-я картинка - это просто график этих координат. Все, что я знаю, это то, что, повернув координаты (или саму ось) на некоторый угол, ее можно преобразовать в первую картинку (ни одна из координат первой картинки не известна)   -  person user1471216    schedule 21.06.2012
comment
О первом изображении, что я знаю: 4 из 5 точек можно соединить, чтобы получить квадрат (со сторонами, выровненными по осям x, y), а пятая точка лежит над центром квадрата.   -  person user1471216    schedule 21.06.2012


Ответы (3)


Если у вас есть координаты точек, вы можете попытаться минимизировать ошибку, задав соответствующий функционал ошибки, зависящий от угла и смещения.

Эта проблема становится решаемой линейным методом наименьших квадратов, если у вас также есть масштаб в вашем преобразовании. В этом случае решение в Matlab простое:

Пусть x, y будут вашими исходными точками, а xt, yt — результирующими точками.

   tform = cp2tform([x,y],[xt,yt],'linear conformal');

Это преобразование можно применить к изображению с помощью imtransform


В случае, если ваша модель не имеет масштаба, а только вращается и сдвигается, вы можете найти приближенное решение с помощью следующих уравнений наименьших квадратов:

   ( x1   y1  1  0)                      (x1t)
   (-y1   x1  0  1)                      (y1t)
   ( x2   y2  1  0)                      (x2t)
   (-y2   x2  0  1) * ( cos(theta) )     (y1t)
          ...         ( sin(theta) ) = 
          ...         (    xc      )
          ...         (    yc      )

   (xn   yn  1   0)   
   (-yn  xn  0   1)                       (ynt)

Очевидно, что вы не можете заставить cos(theta) и sin(theta) иметь одинаковую тета, поэтому решение будет приблизительным. Оно может служить исходным решением и уточняться методом градиентного спуска.

person Andrey Rubshtein    schedule 21.06.2012

Если у вас есть доступ к Statistics Toolbox, я думаю, что команда procrustes может сделать то, что вам нужно. Учитывая два набора точек, он находит наилучшее (с точки зрения суммы квадратов ошибок) линейное преобразование (перемещение, отражение, ортогональное вращение и масштабирование) точек в одном, чтобы привести их в соответствие с точками в другом.

Вы можете подавить компоненты масштабирования и отражения, используя дополнительные входные данные для команды. Если вы переведете оба набора в общую исходную точку перед применением команды, вы также подавите компонент перевода и останетесь только с поворотом.

person Sam Roberts    schedule 21.06.2012

Если я правильно понял ваш вопрос, это проблема абсолютной ориентации. Для него можно найти несколько решений (например, решение Хорна с использованием кватернионов). Аналогичный вопрос можно найти здесь< /а>.

person stefano    schedule 21.06.2012