[영상 Geometry #3] 2D 변환 (Transformations)

영상처리 2013. 7. 8. 15:26

(3D 비전 geometry 3번째 파트 2D 변환입니다)


3. 2D 변환 (2D Transformations)


변환에 대해서는 2D 변환과 3D 변환을 구분해서 설명하겠습니다. 2D 변환은 detection 또는 tracking 문제에 있어서 아래 그림과 같이 두 이미지 사이의 매칭(matching) 관계를 이미지 평면에서 직접 모델링할때 사용되는 방법입니다.


<그림 1>


이러한 2D 변환 관계를 모델링 할때, 어떤 변환 모델을 사용할지는 문제에 따라 다를 것입니다. 회전변화만을 허용할지, 스케일 변화까지 고려할지, 아니면 affine 또는 원근(perspective) 변화까지 고려할지를 잘 선택해야 합니다. 물론 perspective 변환을 사용하는 경우가 가장 일반적이긴 하지만 그만큼 자유도가 높기 때문에 잘못된 결과를 낼 가능성도 높습니다.


먼저 용어(기호)를 정의하고 넘어가면, 이미지 I에서의 점들은 X = (xi, yi), 이미지 I'에서 X에 대응되는 점들을 X' = (xi', yi'), X와 X' 사이의 변환 관계 중 회전변화(rotation)는 R, 평행이동(translation)은 T라 표기하겠습니다. 변환에 대한 기본적인 내용은 http://blog.daum.net/shksjy/228를 참조하기 바랍니다. 변환(Transformation)에 대한 전반적인 내용이 직관적으로 잘 정리되어 있습니다.


그러면 2D 변환들을 rigid 변환부터 homography까지 단계적으로 하나씩 살펴보겠습니다.


3.1 Rigid Transformation

3.2 Similarity Transformation

3.3 Affine Transformation

3.4 Homography (Projective Transformation)

3.5 OpenCV에서의 2D 변환 함수들

3.6 2D 변환 모델의 선택

3.7 참고 자료(references)



3.1 Rigid Transformation (강체 변환)


가장 기본적인 변환은 rigid(강체) 변환입니다. Rigid 변환은 다른 말로 유클리디언 변환(Euclidean transformation)이라고도 하는데, 형태와 크기를 유지한체 위치와 방향(rotation)만 바뀔 수 있는 변환입니다. 즉, 회전(rotation)과 평행이동(translation)만을 허용하는 변환입니다.


일반적인 rigid 변환을 다루기 전에 rigid 변환 중에서도 더욱 제약조건이 심한 경우부터 살펴보겠습니다.


3.1.1 평행이동(translation)만을 허용한 경우


영상 이동체 추적 문제에 있어서 추적 대상의 크기가 고정이고 회전도 일어나지 않는 경우에는 위치 변화만을 추적하면 됩니다.


--- (1)


이 경우, tx는 xi' - xi 들의 평균, ty는 yi' - yi 들의 평균으로 손쉽게 변환 관계를 구할 수 있습니다.


 --- (2)



3.1.2 회전(rotation)만을 허용한 경우


(x, y)를 반시계 방향으로 θ 라디안(radian)만큼 회전시키는 변환행렬은 다음과 같습니다.


 --- (3)


회전변환에서 주의할 점은 회전의 기준은 원점이라는 사실입니다. 즉, 물체가 제자리에서 도는 것이 아니라 (0, 0)을 기준으로 크게 도는 것입니다.


회전변환의 자유도(degree of freedom)[각주:1]는 1입니다. 따라서 하나의 매칭 쌍만 있으면 회전변환을 유일하게 결정할 수 있습니다. 그렇다면 점 (x1, y1)을 점 (x1', y1')로 회전시키는 변환행렬은 어떻게 구할 수 있을까요?


식 (3)을 직접 이용하는 것은 좋은 방법이 아닙니다. 회전변환은 원점을 기준으로 하기 때문에 만일 두 점의 원점과의 거리가 서로 다르다면 이러한 회전변환 행렬을 존재하지 않게 됩니다.


이 문제를 해결하는 방법은 일단 스케일(scale) 변화까지 고려하여 변환을 구한 후, 나중에 스케일 변화를 제거하는 것입니다. 스케일 변화까지를 고려한 회전변환은 일반적으로 다음과 같이 표현할 수 있습니다 (a = s*cosθ, b = s*sinθ인 셈).


 --- (4)


이 식을 전개한 후에, 다시 a, b에 관해 묶으면 다음과 같은 형태로 바꿀 수 있습니다.


 --- (5)


이제 식 (5)에 매칭 쌍을 하나만 대입해도 역행렬을 이용하여 a, b를 구할 수 있습니다. 만일, 매칭쌍이 여러 개인 경우에는 다음과 같이 식을 세우고 최소자승법(Least Square method) 즉, pseudo inverse를 이용하면 a, b를 손쉽게 구할 수 있습니다.


 --- (6)


이렇게 a, b를 구하고 나면 스케일(scale) s와 회전각 θ는 다음과 같이 계산됩니다.


 --- (7)


이제 s는 버리고 θ만 이용하면 두 점 집합 사이의 매핑 관계를 회전변환만으로 설명할 수 있게 됩니다. 물론 영상에서 물체의 크기 변화까지 허용한다면 s도 같이 이용하면 됩니다.


그런데, 실제 문제에 있어서는 이미지 원점(이미지 왼쪽 상단 모서리)을 중심으로 한 회전변환은 현실적이지 못합니다. 보통의 경우는 현재 물체의 위치에서 제자리 회전이 일어나는 경우가 대부분이겠지요.. 이런 경우는 위 회전변환만으로는 표현이 불가능하며 일반적인(general한) rigid 변환 모델을 필요로 합니다.


3.1.3 Rigid 변환


일반적인 rigid 변환을 행렬식으로 나타내면 다음과 같습니다.


 --- (8)


Full rigid 변환을 이용하면 이제 임의의 회전 및 위치이동이 가능해집니다. 예를 들어, 어떤 물체가 제자리에서 θ만큼 회전하는 경우는 먼저 영상 원점을 중심으로 θ만큼 회전한 후에 원래 있던 자리로 평행이동해 오면 됩니다.


Rigid 변환은 식에서 알 수 있듯이 자유도가 3이며, 변환을 추정하기 위해서는 최소 2개 이상의 매칭쌍을 필요로 합니다. 주어진 매칭쌍들로부터 rigid 변환을 추정할 때에는 앞서 회전변환에서와 같이 일단은 스케일 변화까지 같이 고려하는 것이 좋습니다. 식 (8)을 스케일 변환까지 포함하도록 확장하여 다시 쓰면 아래와 같습니다 (a = s*cosθ, b = s*sinθ, s는 스케일).


 --- (9)


이를 전개한 후, a, b, c, d에 대한 행렬식으로 다시 묶으면 다음과 같습니다.


 --- (10)


 --- (11)


주어진 매칭쌍들을 (x1,y1)-(x1',y1'), (x2,y2)-(x2',y2'), ... 라 할 때, 이 점들을 식 (11)에 대입하여 다음과 같은 형태로 행렬식을 세웁니다.


 --- (12)


이제 식 (12)에서 역행렬(매칭쌍이 2개인 경우) 또는 pseudo inverse(매칭쌍이 2개 이상이고 전체 매칭쌍을 가장 잘 근사하는 rigid 변환을 찾을 경우)를 이용하면 a, b, c, d를 결정할 수 있습니다. 또한 앞서와 마찬가지로 식 (7)을 이용하면 스케일 s와 회전각 θ를 구할 수 있게 됩니다.


마지막으로 이렇게 구한 θ와 c, d를 식 (8)에 대입하면 우리가 원하던 rigid 변환을 얻게 됩니다. ◇


여기서 한가지 짚고 넘어갈 점이 있습니다. 식 (8)에서 제가 평행이동(translation) 부분을 [tx, ty]라 쓰지 않고 [c, d]라 한 이유가 있습니다. 그건 [c, d]가 물체의 평행이동량 뿐만 아니라 (영상원점을 중심으로 한) 회전변환으로 인한 이동량까지 같이 포함된 값이기 때문입니다.


그렇다면 위에서 구한 rigid 변환으로부터 실제 물체가 얼마나 평행이동했는지를 알아낼 수 있을까요? (물체가 얼마나 이동했는지 알아내는 것은 영상 이동체 추적 분야에서는 매우 중요한 문제입니다)


사실 이 부분에서 저도 굉장히 햇갈렸는데.. 저의 결론은 rigid 변환식 자체에서는 알아낼 수 없다 입니다. 예를 들어, 아래 탁구라켓 그림을 살펴보도록 하죠. 만일 아래 그림과 같이 영상 내에서 탁구 라켓이 이동했다면 이 라켓의 평행이동량은 얼마일까요?


<그림 2>


조금만 생각해 보면 이건 어떤 절대적인 문제가 아니라 기준의 문제임을 파악할 수 있을 것입니다. (만일 라켓의 손잡이만 놓고 본다면 평행이동량은 꽤 큽니다. 하지만 라켓의 라바 부분만 놓고 보면 이번엔 평행이동량이 매우 작습니다).


사실 무엇을 기준으로 삼을지는 우리의 주관의 영역이며 그 기준에 따라 평행이동량은 다르게 계산될 수 있습니다. 하지만 문제는 rigid 변환은 우리가 무엇을 기준으로 삼는지에 관계없이 수식적으로 유일하게(동일하게) 결정된다는 점입니다. rigid 변환을 결정하기 위해서는 매칭쌍 2개만 있으며 되기 때문에, p1-p1'과 p2-p2'을 이용해 구한 rigid 변환과 p2-p2', p3-p3'을 이용한 rigid 변환이 동일해야 합니다. 또한 p1-p1', p2-p2'에서 구한 rigid 변환으로 p3를 변환시키면 p3'이 나와야 합니다.


결론적으로 rigid 변환식 자체에서는 평행이동량을 구할 수 없습니다. 그렇다면 평행이동량(또는 물체의 변화된 새로운 위치)을 어떤 식으로 구해야 할까요?


그건 우리가 정한 기준점이 rigid 변환에 의해 어디로 이동하는지를 살펴보면 될 것입니다 (기준점은 당연 물체의 무게중심으로 잡는게 좋겠죠..)



3.2 Similarity Transformation (닮음 변환)


Similarity 변환 즉, 닮음 변환은 rigid 변환에 추가적으로 스케일 변화까지 허용한 변환입니다 (중학교때 배우는 닮은 도형을 생각하면 됩니다). 즉, similarity 변환은 회전(rotation), 평행이동(translation), 크기변화(scaling)로 구성되는 변환이며 앞서 나왔듯이 그 일반식은 다음과 같습니다 (단, a2+b2≠0).


 --- (13)


Similarity 변환의 자유도는 4이며[각주:2] similarity 변환을 유일하게 결정하기 위해서는 2개의 매칭쌍이 필요합니다.


Similarity 변환은 사실 rigid 변환에서 이미 모두 다루었기 때문에 여기서 다시 설명할 필요는 없을 것 같습니다. 다만 여기서는 위 회전, 평행이동, 스케일변화를 하나의 단일(single) 행렬로 표현할 수 있는 homogeneous 표현법에 대해서만 언급하고 넘어가겠습니다.


[컴퓨터 비전에서의 Geometry #2]에서 다루었던 homogeneous 좌표 표현을 사용하면 similarity 변환은 다음과 같이 하나의 행렬 변환으로 표현될 수 있습니다.


 --- (14)


즉, 회전, 스케일링, 평행이동이 행렬 변환 하나로 표현된 것입니다.


X' = AX인 행렬 A는 X에서 X'로의 선형 변환(linear transformation)입니다. 이렇게 homogeneous 형태의 선형변환으로 표현했을 때 가장 큰 장점은 여러 변환들을 행렬 곱으로 자유롭게 결합(composition)할 수 있다는 점입니다. 예를 들어 변환 A1, 변환 A2, 변환 A3를 순서대로 적용하는 것은 X' = A3A2A1X가 되며, 또한 A = A3A2A1인 행렬을 구해서 X' = AX와 같이 하나의 변환으로 표현할 수도 있습니다.



3.3 Affine Transformation


Affine 변환은 직선, 길이(거리)의 비, 평행성(parallelism)을 보존하는 변환이며 그 일반식은 다음과 같습니다.


 --- (15)


또는 다음과 같은 homogeneous 형태로도 표현할 수 있습니다.


 --- (16)


좀더 쉽게 말하면 Affine 변환은 회전, 평행이동, 스케일 뿐만 아니라 shearing, 반전(reflection)까지를 포함한 변환입니다.


Affine 변환의 자유도는 6이고, 따라서 3쌍의 매칭쌍이 있으면 affine 변환을 유일하게 결정할 수 있습니다. 임의의 세 점 (x1,y1), (x2,y2), (x3,y3)를 (x1',y1'), (x2',y2'), (x3',y3')로 매핑시키는 affine 변환은 다음과 같이 계산할 수 있습니다 (식 15를 전개하여 a,b,c,d,e,f에 대해 묶은 후 세 점을 대입).


 --- (17)


물론 매칭쌍이 3개 이상인 경우에는 pseudo inverse를 이용하여 affine 변환을 구할 수 있습니다.


2D 평면에서의 affine 변환을 직관적으로 이해하는 한 방법은 임의의 삼각형을 임의의 삼각형으로 매핑시킬 수 있는 변환이 affine이다 (단, 평행성을 보존하면서) 라고 이해하는 것입니다.


<그림 3>


평행성을 보존한다는 의미는 예를 들어 위 그림과 같이 점 p1, p2, p3를 p1', p2', p3'으로 매핑시키는 affine 변환을 구했을 때, 이 affine 변환을 가지고 p4를 매핑시키면 p4'이 나와야 한다는 의미입니다. 


정말 그렇게 되는지는 식 (15)를 가지고 설명해 보겠습니다. 식 (15)를 X'=AX+B로 놓고 p1, p2, p3를 가지고 affine 변환 즉, A와 B를 결정했다고 해 보죠. 그러면 p1' = Ap1 + B, p2' = Ap2 + B, p3' = Ap3 + B는 당연히 만족해야 하는 것입니다. 벡터 p1p4 = p1p2 + p1p3이므로 p4 = p2 + p3 - p1입니다. 따라서 p4의 affine 변환인 Ap4 + B는 A(p2+p3-p1) + B = Ap2 + Ap3 - Ap1 + B = (p2'-B) + (p3'-B) - (p1'-B) + B = p2' + p3' - p1'가 됩니다. 즉, p4가 p2' + p3' - p1'으로 매핑된다는 것인데, p2'+p3'-p1'은 바로 p1'p2', p1'p3'을 두 변으로 하는 평행사변형의 꼭지점입니다.


사실 여기까지는 수학적인 관점에서의 내용이고 정작 중요한 것은 과연 affine 변환이 우리가 풀고자 하는 문제에 있어서 영상에서의 물체의 변화를 모델링하기에 가장 적합한 모델이냐 여부일 것입니다. 특히나 affine 변환부터는 reflection 즉, 뒤집힘이 허용되기 때문에 이러한 자유도가 문제에 득이 될지 실이 될지를 잘 따져보고 모델을 선택해야 할 것입니다.



3.4 Homograpy (Projective Transformation)


Planer surface 물체의 경우에는 3D 공간에서의 2D 이미지로의 임의의 원근투영변환(perspective projective transformation)을 두 이미지 사이의 homography로 모델링할 수 있습니다. 즉, 어떤 planar surface가 서로 다른 카메라 위치에 대해 이미지 A와 이미지 B로 투영되었다면 이미지 A와 이미지 B의 관계를 homography로 표현할 수 있다는 것입니다.


그래서 homography를 planar homography라고도 부르며, homography는 평면물체의 2D 이미지 변환관계를 설명할 수 있는 가장 일반적인 모델입니다. 또한 Homography는 projective transformation과 같은 말입니다.


Homography는 homogeneous 좌표계에서 정의되며 그 일반식은 다음과 같습니다.


 --- (18)


Homography는 자유도가 8이며 따라서 homography를 결정하기 위해서는 최소 4개의 매칭쌍을 필요로 합니다. Homography의 자유도가 9가 아니라 8인 이유는 (x,y,1), (wx',wy',w)이 homogeneous 좌표이므로 homography의 scale을 결정할 수 없기 때문입니다 (∵ homography 변환 X'=HX에서 X, X'은 homogeneous 좌표이기 때문에 X'=kHX도 성립하게 됩니다. 즉, H가 homography 행렬이라면 임의의 0이 아닌 k에 대해 kH도 또한 동일한 homography 행렬이 됩니다).


주어진 매칭쌍들로부터 homography를 실제 구하는 과정에 대해서는 Elan Dubrofsky, "Homography Estimation", 2009 글을 참조하기 바랍니다. Homography를 구할 수 있는 다양한 방법들이 잘 정리되어 있습니다.


Homography를 직관적으로 이해하기 위한 한 좋은 방법은 2D 평면에서 임의의 사각형을 임의의 사각형으로 매핑시킬 수 있는 변환이 homography다 라고 생각하는 것입니다. 물론 사각형이 뒤집혀질 수도 있습니다.


<그림 4>



3.5 OpenCV에서의 2D 변환 함수들


OpenCV에서는 다음과 같이 homography만 3×3 행렬로 표현하고, affine 등 그 외 변환은 2×3 행렬로 표현합니다 (두 행렬 모두 원소 타입은 double 입니다, CV_64FC1).


 --- (19)


--- (20)


OpenCV에서 2D 변환과 관련된 함수들을 정리해 보았습니다.

  • estimateRigidTransform(): 다수의 매칭쌍으로부터  similarity 변환이나 affine 변환을 구할 때 사용 (파라미터로 선택 가능). 내부적으로 RANSAC을 이용. opencv2/video/video.hpp
  • getAffineTransform(): 3쌍의 입력 매칭쌍으로부터 affine 변환을 구해줌. opencv2/imgproc/imgproc.hpp
  • invertAffineTransform(): affine 변환의 역변환을 구해줌, opencv2/imgproc/imgproc.hpp
  • getPerspectiveTransform(): 4쌍의 입력 매칭쌍으로부터 homography 행렬을 계산해 줌. opencv2/imgproc/imgproc.hpp
  • findHomography(): 다수의 매칭쌍으로부터 homography 행렬을 계산해 줌 (근사 방법은 전체 데이터 fitting, RANSAC, LMedS 중 선택), opencv2/calib3d/calib3d.hpp
  • transform(): 2×2 또는 2×3 변환행렬(similarity, affine 등)을 이용하여 좌표변환을 할 때 사용
  • perspectiveTransform(): 3x3 homography 변환행렬 또는 4×4 변환행렬을 이용하여 좌표변환을 할 때 사용


이 외에 OpenCV API 목록에는 없지만 opencv/modules/video/src/lkpyramid.cpp에 보면 icvGetRTMatrix 라는 함수가 하나 숨어있습니다. 이 함수를 이용하면 RANSAC이 아닌 전체 매칭쌍을 근사한 similarity 변환 또는 affine 변환을 구할 수 있습니다.



3.6 2D 변환 모델의 선택


그러면 실제 자신의 영상인식 문제에 사용할 2D 변환 모델을 선택할 때 고려할 사항 또는 참고사항을 몇 가지 적어보겠습니다.


먼저, homography는 위 <그림 1>의 고양이 그림판과 같은 planar한 물체에 대한 변환 모델입니다 (homography 뿐만 아니라 affine, similarity 등도 모두 평면형 물체에 대한 변환 모델입니다). 따라서 주사위 등과 같은 3차원 (입체) 물체의 매핑 관계는 homography만으로는 표현이 안됩니다 (이 경우는 3D 변환 모델이 필요할 것입니다).  물론 주사위의 각각의 면은 homography로 매핑시킬 수 있습니다. 그렇다고 3D 물체에 2D 변환을 사용하지 못하는 것은 아닙니다. 카메라에 아주 근접한 경우가 아니라면 대부분의 물체는 평면으로 가정해도 큰 무리가 없기 때문입니다. 예를 들어, 사람 얼굴을 찾거나 추적하는 경우에 고개를 옆으로 돌리지 않는 한 얼굴 모습은 크게 바뀌지 않습니다.


Homography는 가장 일반적인 2D 변환 모델이며 planar한 물체의 모든 가능한 3D 변화를 표현할 수 있는 모델입니다. 하지만 일반적인 만큼 데이터에 overfitting 될 수 있는 위험성도 가지고 있습니다. 따라서 이 위험도를 줄이기 위해서는 문제의 특성에 따라 가능한 낮은 자유도의 변환을 사용하는 것이 좋습니다. 하지만 위 <그림 1>처럼 3D 공간에서 자유롭게 움직이는 물체를 검출하기 위해서는 어쩔 수 없이 homography를 사용해야 합니다.


Detection과 Tracking의 차이. Detection 문제에 있어서는 문제 특성에 따라 적절한 변환을 선택하면 되지만, tracking의 경우에 있어서는 3D 모션이 있더라도 굳이 homography를 사용할 필요가 없으며 대부분 similarity나 affine으로 충분합니다. 그 이유는 인접한 영상 프레임 사이에는 변화가 그리 크지 않기 때문입니다.


마지막으로, homography나 affine을 사용하면 가끔 말도 안되게 매핑이 되는 경우를 종종 발견할 수 있을 것입니다. 그 경우는 바로 매핑이 뒤집혀진(reflected) 경우인데, 그건 affine과 homography가 reflection을 포함하기 때문입니다. 그런데 영상인식 관점에서는 이 reflection이 불필요한 경우가 대부분입니다. 예를 들어, <그림 1>에서 고양이 그림판이 뒤집혀서 뒷면이 보이는 경우까지를 고려하는게 합당할까요? DB에 저장된 고양이 그림과 그림판의 뒷면(뒷면에는 과연 뭐가 있을까요?)을 매칭시키는 것은 패턴매칭 관점에서 말도 안되며 가능하지도 않습니다. 따라서 homography나 affine을 사용할 경우에는 추정된(estimated) 변환에 reflection이 포함되었는지를 조사하여 reflection이 들어간 경우에는 추정이 잘못된 것으로 판단하는게 좋습니다.



3.7 참고 자료(references)


http://blog.daum.net/shksjy/228

Elan Dubrofsky, "Homography Estimation", 2009

위키피디아 Homography



by 다크 프로그래머


  1. 그냥 쉽게 미지수의 개수라고 생각해도 무방합니다. [본문으로]
  2. 회전, 스케일, x축이동, y축이동 [본문으로]

'영상처리' 카테고리의 다른 글

[영상 Geometry #4] Homography 보완  (38) 2013.07.12
[영상 Geometry #2] Homogeneous Coordinates  (24) 2013.07.06
[영상 Geometry #1] 좌표계  (112) 2013.07.06