영상의 기하학적 변환

1. 개요
영상의 기하학적 변환에서 간단한 것으로는 영상의 확대 및 축소, 영상의 회전, 영상의 반사, 영상의 이미지 모델에 의한 변한 등이 있다. 이보다 복잡한 것으로 우리가 지정한 객체(사각형, 구, 타원체 등)상으로 영상을 매핑하는 것도 일종의 기하학적 변환이라 볼 수 있다.

기하학적 변형 후의 영상을 만드는 방법으로는 이를 만드는 방향으로 분류하면 2가지로 분류할 수 있다. 첫 번째는 원래의 이미지에서 목적 이미지로 구현하는 것이며, 두 번째는 목적 이미지에서 원래 이미지로의 구현이다. 첫 번째 방법을 순방향 매핑(forward mapping)이라 하며, 두 번째 방법을 역방향 매핑(backward mapping)이라고 한다.

 

실제 구현에서는 역방향 매핑을 많이 사용하며 이는 목적 이미지의 각 위치를 스캔하면서 해당 목적 이미지로 매핑되는 원 이미지상의 좌표를 계산하여 해당 밝기값을 가져오면 되기 때문이다. 순방향 매핑을 구현하는 경우, 목적 이미지상에서 공백이나 과다한 충돌 등이 발생하게 되며, 추가적으로 이 공백을 채우거나 충돌을 해결하는 기법을 사용하여야 한다.

 

역방향 매핑의 실제 구현시 해당하는 이미지상의 좌표가 정수가 아니라 실수값인 경우가 많다. 이와같은 경우 해당 지점의 밝기값의 결정시 주변 정수 지점의 값을 이용하며 이들중 한 방법인 이중선형 보간(bilinear interpolation)방법이 아래 그림에 나타나 있다.

사용자 삽입 이미지위의 그림에서 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)

확대 영상에서 할당받지 못한 빈 픽셀에 바로 옆 픽셀의 데이터 값을 할당함으로써 영상의 품질 향상을 보장하여 준다. 이때 X축으로 먼저 빈 픽셀들을 옆의 픽셀로 채워주고 다음에 Y축으로 빈 픽셀들을 채워주는 방법으로 구현한다.
사용자 삽입 이미지최근접 이웃 보간법은 매우 간단한 알고리즘으로 품질 향상을 가져올 수 있다. 하지만 최근접 이웃 보간법은 빈 픽셀에 이웃하는 픽셀의 값을 할당하므로 계단 현상이 나타나며 좀더 정확한 확대 영상을 필요로 하는 영상처리 프로그램에서는 한계가 있다.평균값을 이용하는 보간법 : 이중 선형 보간법(Bilinear interpolation), 큐빅 보간법(Cubic 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;

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다