2009-12-06 2 views
2

Я не знаю, если это должно произойти на математическом форуме или на форумах программирования, но я отправлю его в обоих и посмотрю, где я получу.Попытка получить матрицу 2D-преобразования, используя только изображения

У меня есть два компьютерных изображения ... один из них - это «оригинальное» изображение (большой файл TIF). Другая - преобразованная версия исходного изображения ... она была повернута, сдвинута и переведена в программную программу. Мне нужно сделать некоторую работу над преобразованным изображением, но мне нужно (x-y) координаты каждого пикселя в исходном изображении, чтобы закончить мои вычисления.

Я знаю, что изображение было повернуто и сдвинуто с матрицей трансформации 3x3. Если бы у меня была матрица, я мог бы получить второе изображение с первого (или наоборот) самого. Я точно не знаю, сколько он был повернут, сдвинут или переведен, поэтому я не могу просто вывести матрицы из набора известных преобразований. У меня есть набор соответствующих точек (углы и др.) В каждом изображении и соответствующие им координаты (x, y). Итак, вот моя дилемма:

Используя набор соответствующих преобразованных точек ((x, y) -> (x ', y'), три или более из них), можно получить матрицу преобразования, которая была использована для поворота одно изображение в другое? Если я могу получить матрицу, я могу решить для исходных координат всех пикселей (все 18 миллионов из них) и получить сделанные вычисления, которые мне нужно сделать.

Может ли кто-нибудь помочь? Я знаком с линейной алгеброй ... просто недостаточно знакомы, чтобы получить это без целой царапины. Все ценится!

  • Майк
+0

Эта проблема была дайвинг меня с ума. Пожалуйста, посмотрите [здесь] (http://stackoverflow.com/questions/8959657/order-sequence-of-matrix-transformations-in-2d) и [здесь] (http://stackoverflow.com/questions/8834070/матрица-координатно-преобразование порядка). Если бы я мог только перевести ваши ответы на простое программирование. –

ответ

3

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

Руководство

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

alt text http://www.praeclarum.org/so/wellner.png

(от Interacting with Paper on the DigitalDesk и более подробно Пьера Wellner в в его Thesis)

Теперь вам нужно решить только для коэффициентов уравнения Тион.

С четырех пар точек, два набора из четырех линейных уравнений можно быстро решить методом исключения Гаусса, чтобы найти значения С1-8.

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

Но я бы просто придерживался нелинейных уравнений (выше), так как они могут обрабатывать перспективные искажения.

Автоматическая

Такой же метод, но вы можете использовать краевой-детектор comboined с алгоритмом обнаружения линии, чтобы найти набор 4-иш линий, грим прямоугольника.

Если прямоугольники изображения действительно выделяются (whiteish изображения на темном фоне), то вы можете использовать угол обнаружения доступные из библиотек, как OpenCV's Feature Detection (см cvCornerHarris).

Вы можете пересечь эти линии, чтобы найти четыре угла и использовать уравнение преобразования.

+0

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

+0

Ох. Хорошо гауссовская элиминация хорошо документирована в таких книгах, как «Численные алгоритмы». Но я хотел бы подчеркнуть, что это намного превосходит аффинные преобразования 3х3, поскольку оно может обрабатывать перспективное искажение (нелинейное неаффинное преобразование). Если есть интерес, я могу расширить свой ответ. –

+0

Комментарий Span.Я хотел бы добавить, что я использовал этот точный метод в производственном проекте для отличного эффекта. Приношу свои извинения, если я не делаю это справедливо, но не позволяйте моему описанию блеска отвлекать вас от этой мощной техники. Пожалуйста, прочитайте связанные материалы. –

1

Я думаю, вы должны начать с предоставления списка, скажем точки (6 неизвестных) с X/Y координаты до и после преобразования.

Тогда кто-то более умный, чем я должен поместить это в набор линейных уравнений, а затем накормить его (скажем) Wolfram Alpha для решения.

В верхней части документации Java для AffineTransform показывает, как матрица должна быть установлена:

[ x'] [ m00 m01 m02 ] [ x ] [ m00x + m01y + m02 ] 
[ y'] = [ m10 m11 m12 ] [ y ] = [ m10x + m11y + m12 ] 
[ 1 ] [ 0 0 1 ] [ 1 ] [   1   ] 

Удаление большинство из пуха листьев:

[ x'] [ m00x + m01y + m02 ] 
[ y'] = [ m10x + m11y + m12 ] 

Тогда вы только что создали набор 6 x 2:

m00x + m01y + m02 - x' = 0 
m10x + m11y + m12 - y' = 0 

(повторить для 2 других x/y перед/afte r пар)

и бросить их на решение уравнения.

+0

Это упрощение моего ответа, когда вы просто отбрасываете термины c3 и c7. Но, хорошая работа, написание собственно линейной алгебры. Ваш «решатель уравнения» - это мое «Гауссово исключение». –

+0

Спасибо! Я рад видеть, что я подошел близко. Я думаю, что я сделал свою последнюю GE 30 лет назад; с тех пор я был счастлив позволить программе сделать это. Рад видеть, что Майк заботился о профессионале. –

1

Для определения матрицы преобразования 3x3 вам нужно всего 3 точки. Если у вас есть точки (0,0), (0,1) и (1,0) и преобразовать их по матрице [abcdef 0 0 1], вы получите (c, f), (b, e) и (a, d).

+0

О ... у нас есть 6 неизвестных, но для каждой пары точек есть 2 уравнения ... так что 3 пары дадут нам 6 уравнений. Умная! –