Нормализация двумерных координат, которые произвольно преобразуются.

Первоначально это было опубликовано как вопрос программирования, поэтому я постараюсь сохранить его как можно более абстрактным.

Мы имеем дело с двумя изображениями. Первый - оригинал, а второй - искаженная версия оригинала. Образцы изображений прилагаются.

В оригинале один квадрат (маркер) нарисован слева вверху, один справа вверху и один справа внизу. Три квадрата используются для определения ориентации. Мы знаем ж я г т час , час е я г час т изображения и ( Икс , у ) координаты всех трех маркеров. Так же есть интерес ( п ) на изображение, чье ( Икс , у ) позицию мы знаем.

К искаженной версии применены некоторые преобразования (только перемещение, масштабирование и вращение). Это очень распространено, если документ/изображение печатается и сканируется обратно в систему. Он может быть даже перевернутым, перекошенным и т. д., но пока давайте проигнорируем это и предположим, что даже поворот не более 15 градусов.

Теперь я могу обнаружить ( Икс , у ) координаты всех маркеров и рассчитать угол поворота, количество ( Икс , у ) перевод и ( Икс , у ) коэффициент масштабирования.

Теперь я могу обнаружить ( Икс , у ) координаты всех маркеров для трансформированного изображения и нужно вычислить преобразованное п :

т п "=" ф ( о м 1 , о м 2 , о м 3 , о п , т м 1 , т м 2 , т м 3 ) где

  • о м 1 , о м 2 , о м 3 являются оригинальными маркерами.
  • о п является исходной достопримечательностью.
  • т м 1 , т м 2 , т м 3 являются преобразованными маркерами.
  • т п представляет собой преобразованную точку интереса.

Здесь есть два разных вопроса:

  • Как я могу вычислить координаты для преобразованного ( п ) ?
  • Какие угловые случаи следует учитывать?

Оригинал Преобразованный / Искаженный

Я понимаю. Это говорит мне, что если мы допускаем масштабирование как по x, так и по y, и у нас есть вращение вдобавок к этому, мы получаем перекос как естественный результат. В любом случае, я не уверен, как ответить на ваши вопросы о «порядке» преобразований, поскольку преобразования являются результатом неточных сканеров и не находятся под моим контролем. Обычно это не приводит к различному масштабированию x и y, и мы можем обойтись предположением, что масштабирование будет единственным значением. Отвечает ли это на ваш вопрос?
Это так, и это делает ответ немного проще.
Я дал ответ. Я также удалил все свои комментарии, чтобы уменьшить беспорядок, а также потому, что в некоторых из них я использовал неправильную терминологию; класс преобразований, который вы рассматриваете, - это класс преобразований подобия плоскости.

Ответы (1)

Как поясняется в комментариях, рассматриваемые преобразования составляют все преобразования подобия плоскости. Любое такое преобразование может быть записано как произведение Т р С , где Т это перевод, р это вращение и С является однородным скейлингом. В координатах это

( Икс у ) "=" ( потому что α грех α грех α потому что α ) ( с 0 0 с ) ( Икс у ) + ( т Икс т у ) .

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

Угол поворота α можно извлечь из верхних маркеров: α "=" арктический ( ( у 2 у 1 ) / ( Икс 2 Икс 1 ) ) , где ( Икс 1 , у 1 ) - координаты верхнего левого маркера и ( Икс 2 , у 2 ) координаты верхнего правого маркера. (Это предполагает, что маркеры изначально имеют одинаковые у координата; если нет, вам нужно вычесть соответствующий угол, рассчитанный из исходных координат.)

Коэффициент масштабирования с можно определить по изменению расстояния между любыми двумя маркерами, скажем, верхними маркерами: с "=" ( Икс 2 Икс 1 ) 2 + ( у 2 у 1 ) 2 / ( Икс 2 Икс 1 ) , где Икс 1 и Икс 2 являются оригинальными Икс координаты верхних маркеров. (Опять же это предполагает, что их первоначальный у координаты равны; в противном случае знаменатель представляет собой квадратный корень, аналогичный числителю.)

Теперь перевод ( т Икс , т у ) можно определить по любому маркеру, скажем, по верхнему левому маркеру:

( т Икс т у ) "=" ( потому что α грех α грех α потому что α ) ( с 0 0 с ) ( Икс 1 у 1 ) + ( Икс 1 у 1 ) .

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

Спасибо. Есть ли какие-либо другие угловые случаи, на которые следует обратить внимание, помимо упомянутого вами порога вращения? И даже если бы этот порог был перейден, я полагаю, что мог бы вычислить и применить только R, чтение в новых позициях маркера затем применить только TS, чтобы избежать коммутативных побочных эффектов.
@Raheel: я не уверен, что вы подразумеваете под «угловыми случаями». Если порог ротации не превышен, проблемных особых случаев быть не должно. Если это так, то основной проблемой становится правильное определение маркеров. Я не понимаю вашего предложения сделать это, поскольку р можно определить только после того, как вы уже правильно идентифицировали маркеры, и если вы это сделали, вам больше не нужно какое-либо специальное лечение. Я бы предложил идентифицировать маркеры, вычислив углы в треугольнике, который они образуют; верхний правый маркер - тот, у которого прямой угол.
Я понимаю. Я думал, что вы изначально имели в виду, что функция будет работать только до 15 градусов поворота, но я понимаю, что вы имели в виду « пока маркеры идентифицируются правильно, все хорошо ».