2013-11-15 8 views
2

Я пытаюсь найти 2-D affine tranform даны две точки, используя решение, данное Kloss, and Kloss in “N-Dimensional Linear Vector Field Regression with NumPy.” (2010, The Python Papers Source Codes 2).Минимальное количество точек в поиске аффинного преобразования?

Article source code.

Они дают подход к нахождению аффинного преобразования, соединяющие два множества точек у и х, где преобразования представлена ​​матрицей и вектор б (т.е. матрицы уравнения у = Ax + b).

В двух измерениях у вас есть 6 неизвестных, четыре определяющих 2х2 матрицы и 2, образующая б.

Однако в примере сценария и в описании, описывающем его, у них есть неизвестные t = n^2 + n, где n - количество точек, что означает, что вам нужно шесть очков, что для 2D-случая на самом деле известно 12 значения (т. е. значения х и у каждой точки на изображении).

они проверить это с помощью:

def solve(point_list): 
    """ 
    This function solves the linear equation system involved in the n 
    dimensional linear extrapolation of a vector field to an arbitrary point. 

    f(x) = x * A + b 

    with: 
     A - The "slope" of the affine function in an n x n matrix. 
     b - The "offset" value for the n dimensional zero vector. 

    The function takes a list of n+1 point-value tuples (x, f(x)) and returns 
    the matrix A and the vector b. In case anything goes wrong, the function 
    returns the tuple (None, None). 

    These can then be used to compute directly any value in the linear 
    vector field. 
    """dimensions = len(point_list[0][0]) 
    unknowns = dimensions ** 2 + dimensions 
    number_points = len(point_list[0]) 
    # Bail out if we do not have enough data. 
    if number_points < unknowns: 
     print ’For a %d dimensional problem I need at least %d data points.’ \ % (dimensions, unknowns) 
     print ’Only %d data points were given.’ % number_points return None, None. 

...

Вопрос:

Почему они говорят, что нужно 6 очков, чтобы получить 2D аффинное преобразование?

opencv getAffineTransform требуется только 3 точки данных, чтобы найти точку в 2D, которая является интуитивным числом, поскольку 3 точки определяют плоскость. И когда я беру вышеупомянутый условный тест из кода Kloss и Kloss, он работает на 3 балла в 2D.

ответ

2

Как добраться до точки,

Почему они говорят, что нужно 6 очков, чтобы получить 2D аффинное преобразование?

Я думаю, вы имеете в виду бит непосредственно перед экватором. (4) статьи, где говорится, что вам нужно как минимум m>=n^2+n. Там, m - количество пар точек и n - это количество измерений.

Я думаю, что они не обращали много внимания, и они имели в виду m>=n+1.

Это означало бы, что в 2D вам нужно будет n+1=3 пары точек в, и в 3D мы должны были бы n+1=4 пары точек, чтобы полностью определить аффинное преобразование. Обратите внимание, что вы сможете найти решение, если точки не являются коллинеарными.

Это согласуется со ссылкой OpenCV Вы в курсе, с 3x2=6 входных nubers (3 исходных точек, каждая из которых с двумя координатами) и аналогично 6 номера выходов:

(x1,y1,x2,y2,x3,y3) Into X[x1,y1],Y[x1,y1],X[x2,y2],Y[x2,y2],X[x3,y3],Y[x3,y3]

(Обратите внимание, однако, что OpenCV оценивает точное аффинное преобразование, в то время как в статье нет)

Сказал, что вам это часто не волнует.

Возможно, вам понадобится аффинное преобразование с меньшим количеством очков, а затем m, и вас интересует одно из многих решений.

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

+0

Спасибо, что посмотрели на мой вопрос. Вы отвечаете, соглашаясь с моим пониманием. Хотя, я нашел m> n^2 + n в трех местах, в упомянутом коде и документе, а также в аналитической статье: Späth, H. (2004), аффинных и ортогональных преобразованиях между двумя множествами пунктов, Математическая связь, 9 (1), 27-34. Такая же ошибка в трех местах вызывает тревогу, но я не нашел другого объяснения. Я попытаюсь связаться с авторами и посмотреть, есть ли более тонкое объяснение. http://hrcak.srce.hr/index.php?show=clanak&id_clanak_jezik=1425&lang=en –

+0

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

+0

@ E.Douglas, любые новости? – gg349

3

Почему они говорят, что вам нужно 6 баллов, чтобы получить двумерное аффинное преобразование?

Для таких преобразований удобно работать с homogenous coordinates, что ввести третий w координат, то есть:

  • (x, y) становится (x, y, w),
  • две точки эквивалентны тогда и только тогда x'/w' = x/w и y'/w'= y/w.

Таким образом, вы можете использовать w = 1.

С помощью этой системы можно представить 2D преобразования (перемещения, поворота и т.д.) с матричным умножением:

[x']  [x] 
[y'] = A . [y] 
[1 ]  [1] 

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

[1 0 tx] [Sx 0 0] [cos(a) -sin(a) 0] [a b c] 
A = [0 1 ty] . [0 Sy 0] . [sin(a) cos(a) 0] = [d e f] 
    [0 0 1 ] [0 0 1] [0  0  1] [0 0 1] 

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

Другими словами, вам нужно (по крайней мере) 6 очков (= 3 пары), чтобы вычислить вашу трансформацию.

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

+0

В комментарии к вашему редактированию вам не нужно 6 баллов, чтобы подойти к проблеме в наименьшем квадратичном смысле. – gg349

+0

и их определение точек - это не ваше определение точек, которое всегда совпадает с количеством неизвестных. – gg349

+0

@flebool: если у вас есть> 3 пары, то наименьшие квадраты - это путь. С ровно 3 парами нет необходимости. В противном случае: мое последнее редактирование добавляет еще несколько исправлений по сравнению с количеством точек/пар (действительно, у нас есть 'unknowns/dimensions = dimensions + 1'). – deltheil

Смежные вопросы