Попытка получить матрицу двумерного преобразования, используя только изображения - PullRequest
2 голосов
/ 06 декабря 2009

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

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

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

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

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

  • Mike

Ответы [ 3 ]

3 голосов
/ 06 декабря 2009

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

Руководство

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

альтернативный текст http://www.praeclarum.org/so/wellner.png

(Из книги Пьера Уэлнера Взаимодействие с бумагой на DigitalDesk и другие подробности в его Тезисе )

Теперь вам нужно просто найти коэффициенты уравнения.

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

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

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

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

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

Если ваши прямоугольники изображения действительно выделяются (белесые изображения на темном фоне), тогда вы можете использовать обнаружение углов , доступное из библиотек, таких как Функция обнаружения OpenCV (см. cvCornerHarris) .

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

1 голос
/ 06 декабря 2009

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

1 голос
/ 06 декабря 2009

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

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

В верхней части документации 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 других х / у до / после пар)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...