이제 최근방 이웃 보간법을 이용한 영상의 크기 변환을 C/C++ 함수로 작성해보자. 함수의 이름은 IppResizeNearest를 사용하기로 하고, 다음과 같은 함수 선언을 IppGeometry.h 파일에 추가하자.
void IppResizeNearest(IppByteImage& imgSrc, IppByteImage& imgDst, int nw, int nh);
IppResizeNearest 함수는 네 개의 인자를 받는다. 첫 번째 인자 imgSrc는 입력 영상이며, 두 번째 인자 imgDst는 최근방 이웃 보간법에 의한 크기 변환 결과가 저장될 영상이다. 세 번째와 네 번째 인자인 nw와 nh는 결과 영상의 가로와 세로 크기를 나타낸다. IppResizeNearest 함수의 전체 구현은 소스 9-4에 나타내었다.
void IppResizeNearest(IppByteImage& imgSrc, IppByteImage& imgDst, int nw, int nh) { int w = imgSrc.GetWidth(); int h = imgSrc.GetHeight(); imgDst.CreateImage(nw, nh); BYTE** pSrc = imgSrc.GetPixels2D(); BYTE** pDst = imgDst.GetPixels2D(); int i, j, x, y; double rx, ry; for (j = 0; j < nh; j++) for (i = 0; i < nw; i++) { rx = static_cast<double>(w - 1) * i / (nw - 1); ry = static_cast<double>(h - 1) * j / (nh - 1); x = static_cast<int>(rx + 0.5); y = static_cast<int>(ry + 0.5); if (x >= w) x = w - 1; if (y >= h) y = h - 1; pDst[j][i] = pSrc[y][x]; } }
최근방 이웃 보간법의 구현 방법은 매우 간단하다. 결과 영상의 모든 좌푯값을 가로, 세로 확대 비율로 나누어주고, 그 결괏값을 단순히 정수형으로 변환하여 참조할 원본 영상의 좌표를 얻을 수 있다.