1. 개요
영상의 기하학적 변환에서 간단한 것으로는 영상의 확대 및 축소, 영상의 회전, 영상의 반사, 영상의 이미지 모델에 의한 변한 등이 있다. 이보다 복잡한 것으로 우리가 지정한 객체(사각형, 구, 타원체 등)상으로 영상을 매핑하는 것도 일종의 기하학적 변환이라 볼 수 있다.
위의 그림에서 I1, I2, I3, I4 지점은 보간 지점과 이웃한 네 지점의 밝기값이며 이중 선형 보간 방법의 경우 보간 지점과의 떨어진 거리에 비례하여 가중치를 두고 있다. 이중 선형 보간의 실제 구현은 아래와 같다.
I1 = (float)m_InImg[i_orgr][i_orgc]; I2 = (float)m_InImg[i_orgr][i_orgc + 1]; I3 = (float)m_InImg[i_orgr + 1][i_orgc + 1]; I4 = (float)m_InImg[i_orgr + 1][i_orgc]; /* 이중 선형 보간을 통한 새로운 밝기값 계산 */ newValue = (BYTE)(I1 * (1 - sc) * (1 - sr) + I2 * sc * (1 - sr) + I3 * sc * sr + I4 * (1 - sc) * sr);
2. 영상의 확대/축소
영상의 확대는 주어진 영상보다 큰 영상을 만드는 과정이며, 일반적으로 정수 배의 확대를 많이 이용하고 있다. 정수 배의 확대에 국한되지 않고 실수 배의 영상 확대를 수행하는 것도 가능하다. 정수 배의 확대의 경우 역방향 매핑을 이용하면 쉽게 구현할 수 있다. 먼저 목적하는 이미지의 크기를 배율에 의해 계산 후 각각의 위치를 스캔하면서 각 위치에 해당하는 원 이미지상에서의 위치를 계산 후 그 지점에서 밝기값을 가져오면 된다.
원 영상을 확대한다는 것은 그리 어려운 일이 아닌 것처럼 보일 것이다. 위 그림을 보면 문제가 있는 것을 발견할 수 있을 것이다. 원 영상의 총 픽셀 수는 4개이고 확대 영상의 총 픽셀 수는 9개이다. 그렇다면 반전되어 있지 않은 픽셀은 어떤 값도 할당받지 못한 상태일 것이다. 이러한 할당받지 못한 빈 픽셀을 홀(hole)이라고 한다.
최근접 이웃 보간법(Nearest neighber interpolation)

이중 선형 보간법(Bilinear interpolation)

위의 식에서 앞쪽 부분이 순방향 매핑에 관한 식이며 뒤쪽 부분의 식이 역방향 매핑에 관련된 식이다. 식에서와 같이 먼저 x, y 방향으로의 스케일 Sx, Sy가 주어진 경우(양의 정수, 실수값 모두 가능), 역방향 매핑을 이용하여 새로운 이미지의 좌표를 스캔하면서 값을 대입하면 원 이미지상의 좌표값을 알 수가 있다. 원 이미지상의 좌표값이 정수가 아닌 경우 앞의 그림의 이중 선형 보간 과정을 통하여 밝기값을 계산할 수 있다.
3. 영상의 회전
영상의 회전은 이미지 평면상에서 원하는 각도 만큼 영상을 회전시키는 것이다. 이 과정도 역방향 매핑을 이용하는 경우, 쉽게 구현할 수 있다. 목적 이미지상에서 각 지점의 위치와 회전각을 이용하여 원 이미지상에서의 위치를 결정 후 원 이미지상에서의 밝기값을 이용하면 된다. 이 경우 원 이미지상의 위치가 정수값이 아니라 실수 값일 경우 보간 기법을 이용하여 대표 밝기값을 결정하도록 한다. 가장 많이 사용하는 보간법으로는 이중 선형 보간 방법이 있다.
위의 식에서 (Xorg, Yorg)는 영상의 회전 전의 원 이미지상의 좌표값을 나타내며 (Xnew, Ynew)는 영상의 회전 후의 새로운 이미지상의 좌표값을 나타낸다. (Cx, Cy)는 원 영상에서의 회전 중심의 좌표값을 나타낸다. 위의 식에 의한 영상의 회전을 구현하기 위해서는 위에서 언급한 바아 같이 역방향 매핑 과정을 이용하면 간단하게 구현을 할 수가 있다. 위의 식을 다음과 같이 변환할 필요가 있다.
위의 식의 실제 구현은 다음과 같다.
cosAngle = (float)cos(rotationAngleRad); sinAngle = (float)sin(rotationAngleRad); /* 회전 전의 원 이미지상의 좌표 구함 */ r_orgr = -sinAngle * (c - center_c) + cosAngle * (r - center_r) + center_r; r_orgc = cosAngle * (c - center_c) + sinAngle * (r - center_r) + center_c; i_orgr = floor(r_orgr); /* floor(2.8) = 2.0 */ i_orgc = floor(r_orgc); sr = r_orgr - i_orgr; sc = r_orgc - i_orgc;