한 평면에서 다른 평면으로 연결하는 2차원 변환 중에서 직선의 직선성을 유지하는 것은 perspective 변환(사영변환)이다. 이 변환의 부분인 affine 변환은 평행한 두 직선의 평행성을 그대로 유지한다. 따라서 사각형은 perspective 변환에 의해서 다시 사각형으로 변환된다. 물론 bilinear 변환도 사각형을 다른 사각형으로 변환시키지만 일반적으로 직선의 직선성은 보전하지 못한다. 이 직선성의 보존은 매우 중요한 특성이다. 카메라도 일종의 perspective 변환기로 영상을 센서에 형성할 때 찍는 대상의 직선은 그대로 영상에 직선으로 표현된다. (FOV가 큰 카메라는 렌즈 왜곡이 심해서 보존이 안된다) 평면에서의 변환을 다룰 때는
(ex) affine 변환:
==>
이 표현은 perspective 변환이 선형 변환임을 명시적으로 보여주므로 직선성이 보존된다는 사실 또한 자명해진다.
카메라로 물체를 촬영할 때, 가까운 거리에서 촬영을 하던, 먼 거리에서 촬영을 하던 두 영상은 크기 차이만 있는 동일한 모양의 물체 상을 만들어 낸다. perspective 변환은 3차원에 놓인 평면에서 평면으로 변환으로 생각할 수 있는데, 크기의 차이만 있는 경우에 같은 것으로 본다. 3차원에서 행렬 변환은 9개의 매개변수에 의해서 기술이 되는데, 전체적인 크기의 차이를 무시하므로 1개 매개변수가 줄어들어서 8개의 매개변수로 표현이 된다. perspective 변환을 아래처럼 쓰면 변환된 좌표의 3번째 성분은 일반적으로 1이 아니다. 3번째 좌표
perspective 변환 행렬
다행히 정사각형에서 사변형으로 변환은 수치해석에 의존하지 않고도 답을 적을 수 있다.
denom = (x1 - x2) * (y3 - y2) - (x3 - x2) * (y1 - y2);
a11 = x1 - x0 + a13 * x1 ;
a21 = x3 - x0 + a23 * x3 ;
a31 = x0 ;
a12 = y1 - y0 + a13 * y1;
a22 = y3 - y0 + a23 * y3;
a32 = y0;
a13 = ((x0-x1+x2-x3)*(y3-y2) - (x3-x2)*(y0-y1+y2-y3)) / denom;
a23 = ((x1-x2)*(y0-y1+y2-y3) - (x0-x1+x2-x3)*(y1-y2)) / denom;
a33 = 1.0;
따라서 일반적인 사변형에서 사변형으로의 변환은

처럼 2 단계 변환의 곱으로 주어진다. 사변형에 정사각형으로 변환은 정사각형에서 사변형으로 변환의 역변환이므로 역행렬을 구해야 하나, 이보다는 수치적으로 안정적인 adjoint 행렬을 이용하는 것이 낫다(adjoint을 쓰면 determinant로 나누기를 할 필요가 없다). 이는 perspective변환에서 항상 좌표를 3번째 좌표로 나누어서 사용하기 때문에 가능하다.
'Image Recognition' 카테고리의 다른 글
webcam용 QR code detector (0) | 2012.02.19 |
---|---|
Least Squares Estimation of Perspective Transformation (4) | 2012.02.15 |
Integral Image을 이용한 Adaptive Threshold (0) | 2012.02.04 |
Peak Finder (1) | 2012.02.02 |
QR-code: decoder (0) | 2012.01.26 |