Нормализовать точки в Python, чтобы среднеквадратичное расстояние от начала координат было равно sqrt2

Я хочу реализовать алгоритм DLT, и у меня есть 6 точек объекта (X,Y,Z,1).T и 6 точек изображения (u,v,1).T, которые являются проекцией точек объекта на плоскость изображения,

Поэтому перед внедрением DLT я должен нормализовать данные.

Более конкретно, я обнаружил, что должен сделать следующее: точки 2D-изображения должны быть нормализованы так, чтобы их центроид находился в начале координат, а их среднеквадратичное расстояние от начала координат было равно sqrt(2).

Любая идея, как я могу сделать это в Python?

0 ответов

Взяв 6 точек изображения для двух изображений, одного оригинала и другого деформированного, затем:

x1 = np.array([202,202,500,523,530,522])
y1 = np.array([459,473,403,403,405,434])
x2 = np.array([283,285,526,544,552,550])
y2 = np.array([482,494,371,367,365,392])
img1 = np.column_stack((x1,y1))
img2= np.column_stack((x2,y2))`

def normalise(img):
    '''
    input:img = image points that we want to normalize
    return:Tr = Transformation that normalises the points
    normalised_points = Points normalise by Tr
    '''
    s = np.sqrt(2)/((1/25)*np.sum((np.sqrt(abs(img - np.mean(img,axis=0))**2))))
    m = np.mean(img,0)
    normalised_points = np.zeros((25,3))
    Tr = np.array([[s, 0, m[0]], [0, s, m[1]], [0, 0, 1]])
    for i in range(img.shape[0]):
        normalised_points[i][0] = s*img[i][0] + m[0]
        normalised_points[i][1] = s*img[i][1] + m[1]
        normalised_points[i][2] = 1
    return Tr, normalised_points

Tr1,normalised_X = normalise(img1)

Ссылка

Другие вопросы по тегам