더북(TheBook)

이제 최근방 이웃 보간법을 이용한 영상의 크기 변환을 C/C++ 함수로 작성해보자. 함수의 이름은 IppResizeNearest를 사용하기로 하고, 다음과 같은 함수 선언을 IppGeometry.h 파일에 추가하자.

void IppResizeNearest(IppByteImage& imgSrc, IppByteImage& imgDst, int nw, int nh);

IppResizeNearest 함수는 네 개의 인자를 받는다. 첫 번째 인자 imgSrc는 입력 영상이며, 두 번째 인자 imgDst는 최근방 이웃 보간법에 의한 크기 변환 결과가 저장될 영상이다. 세 번째와 네 번째 인자인 nwnh는 결과 영상의 가로와 세로 크기를 나타낸다. IppResizeNearest 함수의 전체 구현은 소스 9-4에 나타내었다.

소스 9-4 최근방 이웃 보간법을 이용한 영상의 크기 변환 구현 함수(IppGeomerty.cpp)
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];
    }
}

최근방 이웃 보간법의 구현 방법은 매우 간단하다. 결과 영상의 모든 좌푯값을 가로, 세로 확대 비율로 나누어주고, 그 결괏값을 단순히 정수형으로 변환하여 참조할 원본 영상의 좌표를 얻을 수 있다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.