'Isometry'에 해당되는 글 1건

  1. 2010.01.11 Isometric Transformation
기준 좌표계에 대해서 원점이 이동하고 회전한 경우에 이 새로운 좌표계에서 점들의 좌표는 바뀐다. 원래의 좌표와 바뀐 좌표값 사이의 관계를 주는 변환이 Isometric transformation (isometry)이다. 평면상에서 이변환은 평행이동 2개 회전각도 1개에 의해서 결정이 된다. 다수의 점과 그 대응점들이 주어진 경우에 두 둘간의 isometry 파라미터는 일반적으로 최소자승법에 의해서 결정될 수 있다.
회전각도가 θ이고, 평행이동이 (tx, ty)인 isometry에 의해서 두 점 (x,y)가 (u,v)로 연결이 되는 경우에, 아래의 식으로 표현이 된다:

u = cosθ * x - sinθ * y + tx ;
v = sinθ * y + cosθ * x + ty ;

최소자승법을 사용하기 위해서는 회전각도 θ보다는 a = cosθ, b = sinθ로 정의된 새로운 파라미터로 식을 표현하는 것이 더 편리하다. 그러나 이 경우에 파라미터 a, b는 서로 독립적이 아니고  a^2 + b^2 = 1의 제한조건을 만족시켜야 한다.  
평행이동 파라미터는 질량중심의 isometry 관계로 해결이 되므로, 이  전체계산을 각각의 질량중심을 기준으로 하는 좌표로 옮겨서 하면 더 이상 평행이동을 고려할 필요가 없고 회전만 생각하면 된다. 

최소자승법의 원리에 따라서 아래의 라그랑지안을 최소화시키는 파라미터 a, b, λ를 찾으면 된다

L = ∑ ( a * xi - b * yi - ui)^2 + ( b * xi + a * yi - vi)^2 + λ*(a^2 + b^2 - 1) ;

여기서 λ는 제한조건 a^2 + b^2 = 1를 넣기 위한 Lagrange multiplier이다. 라그랑지안 L를 각각 a, b, λ에 대해서 미분하여서 다음의 조건을 얻는다:

∑ ( a * xi - b * yi - ui)*xi + ( b * xi + a * yi - vi)*yi + λ*a = 0
∑ ( a * xi - b * yi - ui)*(-yi) + ( b * xi + a * yi - vi)*xi + λ*b = 0
a^2 + b^2 = 1;

이 식들을  a, b, λ에 대해서 풀면 다음의 관계식을 얻든다:

a = (∑ xi*ui + yi*vi) / (∑ xi^2 + yi^2 + λ) ;
b = (∑ xi*vi - yi*ui) / (∑ xi^2 + yi^2 + λ) ;

또한, 라그랑지 멀티플라이어 λ는

A  = (∑ xi*ui + yi*vi);   B =  (∑ xi*vi - yi*ui);

로 놓으면, a^2 + b^2 = 1 조건에서 

∑ xi^2 + yi^2 + λ = sqrt(a^2 + b^2) 

임을 쓰면 된다. 따라서 우리가 구하는 회전각도는

a = A / sqrt(A*A + B*B);
b = B / sqrt(A*A + B*B);

로 주어진다.

질량중심을 빼기전의 좌표 (x,y)의 질량중심과 (u,v)의 질량중심은 서로 isometry에 의해서 연결이 되므로, 이것에서  평행이동 파라미터(tx, ty) 는 결정이 된다;
(xc, yc) --->(uc, vc) ;
uc = a * xc - b * yc + tx ;
vc = b * yc + a * yc + ty ;

참고:

** affine transformation = similarity transformation + shear;
** similarity transformation = isometry transformation + overall scaling;


/* struct CfPt { double x, y;};
*      u = T[0] * x + T[1] * y +T[4] ;
*      v = T[2] * x + T[3] * y + T[5] ; 
*/
BOOL IsometryTransform(CfPt A[], CfPt U[], int n, double T[6]) {
    double cx = 0, cy = 0;
    double ux = 0, uy = 0;
    for(int i = 0; i < n ; i++) {
        cx += A[i].x ;  cy += A[i].y ;
        ux += U[i].x ;  uy += U[i].y ;
    };
    //center of mass ;
    cx /= n; cy /= n;
    ux /= n; uy /= n;

    //centering 된 좌표계에서 계산;
    double dot = 0 , cross = 0;
    for(i = 0; i < n; i++) {
        double x = A[i].x - cx ;
        double y = A[i].y - cy ;
        double u = U[i].x - ux ;
        double v = U[i].y - uy ;
        dot += (x * u + y * v) ;
        cross += ( x * v - y * u) ;
    };
    double norm = sqrt(dot * dot + cross * cross) ;
    double a = dot / norm ;
    double b = cross / norm ;

    T[0] = a ; T[1] = -b ; T[2] = b; T[3] = a; 
    T[4] = ux - (a * cx - b * cy) ;
    T[5] = uy - (b * cx + b * cy) ;
    return 1;
} ;
저작자 표시 비영리 변경 금지
신고

'Image Recognition' 카테고리의 다른 글

Affine Transformation  (0) 2010.01.20
Color Counting  (0) 2010.01.18
Isometric Transformation  (0) 2010.01.11
Active Shape Model (3)  (0) 2009.12.30
Eigenface (2)  (0) 2009.12.28
Active Shape Model :: Face  (1) 2009.12.27
Posted by helloktk