해당 포스트는 "열혈강의 영상처리 프로그래밍" 책의 내용을 요약한 것이다.



※ 영상의 기하학적 변환

영상의 기하학적 변환은 픽셀의 위치를 이동하여 공간적 변환을 만드는 것으로 평행 이동, 회전, 크기 변화 등이 있다.


픽셀 값의 보간 방법

 imgaeOut.GetAt(x,y) = imageIn(srcX, srcY);

기하학적 변환은 입력 영상의 픽셀을 다른 위치로 옮기는 것이다. 위 코드는 입력 영상의 srcX, srcY 위치 픽셀을 x,y위치에 옮긴다는 뜻이다. 이렇게 픽셀을 옮길 때 GetAt 함수의 인수는 int 형으로 되어 있어서 소수 단위의 위치가 무시되어 정확한 위치 변환이 이루어지지 않는다. 그래서 소수 단위의 이동을 처리하는 방법을 구현해야 하는데 이를 픽셀 값의 보간이라고 한다. 픽셀 값의 보간 방법으로 최단 입점 보간, 쌍선형 보간, 입방 회선 보간, 쌍입방 보간이 있다. 각 방법들 가운데 오른쪽 방법일수록 수행시간이 느리고 대신에 더욱 정교한 보간 결과를 얻을 수 있다.



※ 최단 입점 보간

가장 가까운 원본 픽셀을 선택하는 방법이다. 아래의 그림과 같이 p와 q는 0에서 1사이의 소수인데 단순히 x+p와 y+q를 정수로 반올림하여 해당 위치의 픽셀 값을 가져오는 방법이다. 


BYTE NearestNeighbor(double x, double y)
{
   int px = IN_IMG((int)(x+0.5), 0, m_nWidth);
   int py = IN_IMG((int)(y+0.5), 0, m_nheight);
   return m_pIn[py*m_nWStep + px];
}

#define IN_IMG(x, lo, hi) (x < lo)? lo : x > hi ? hi : x

위 코드가 최단 입점 보간 함수의 구현이다. 단순히 (x+p, y+q)을 반올림해서 정수값을 반환한다. 아래의 매크로 함수는 px 값과 py 값이 입력영상의 범위 내에서 벗어나지 않도록 하는 메서드 이다. 이 최단 입점 보간은 단순히 반올림만 하기 때문에 정확한 변환이 이루어지지 않는다. 만약 x를 0.3픽셀 만큼 왼쪽으로 이동하고 싶다면 최단 입점 보간 함수에 의해서 반올림해 x-0.3이 x가 되서 변환결과가 입력 영상과 똑같아 진다. 



+ Recent posts