더북(TheBook)

IppResizeBilinear 함수의 인자 구성은 앞에서 살펴본 IppResizeNearest 함수와 동일하다. imgSrcimgDst는 각각 입력 영상과 출력 영상이고, nwnh는 크기 변환되어 생성될 결과 영상의 가로와 세로 크기이다. IppResizeBilinear 함수의 전체 구현은 소스 9-5에 나타내었다.

소스 9-5 양선형 보간법을 이용한 영상의 크기 변환 구현 함수(IppGeomerty.cpp)
void IppResizeBilinear(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, x1, y1, x2, y2;
    double rx, ry, p, q, value;

    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);

        x1 = static_cast<int>(rx);
        y1 = static_cast<int>(ry);

        x2 = x1 + 1; if (x2 == w) x2 = w - 1;
        y2 = y1 + 1; if (y2 == h) y2 = h - 1;

        p = rx - x1;
        q = ry - y1;

        value = (1. - p) * (1. - q) * pSrc[y1][x1]
            + p * (1. - q) * pSrc[y1][x2]
            + (1. - p) * q * pSrc[y2][x1]
            + p * q * pSrc[y2][x2];

        pDst[j][i] = static_cast<BYTE>(limit(value + .5));
    }
}

IppResizeBilinear 함수 동작의 이해를 돕기 위하여, 소스 9-5의 for 루프 안에서 사용되는 변수들의 이름에 대한 설명을 그림 9-9에 나타내었다. 실수형 변수 rx, ry는 입력 영상에서 참조할 픽셀 값의 실수 좌표를 나타내고, 정수형 변수 x1, x2, y1, y2는 각각 (rx, ry) 좌표를 둘러싼 4개의 픽셀 좌표를 나타낸다. pq는 0부터 1 사이의 값을 갖는 실수형 변수이다. 이 경우 양선형 보간법으로 구하는 (rx, ry)의 픽셀 값은 다음과 같다.

value = (1. - p) * (1. - q) * pSrc[y1][x1]
    + p * (1. - q) * pSrc[y1][x2]
    + (1. - p) * q * pSrc[y2][x1]
    + p * q * pSrc[y2][x2];

이렇게 구한 value 값을 반올림하여 정수형으로 변환하고, 그 값을 결과 영상의 픽셀 값으로 저장한다. 만약 반올림한 값이 255보다 커질 경우 255로 설정하도록 limit 함수를 사용하였다.

그림 9-9 IppResizeBilinear 함수에서 사용된 변수들의 의미

소스 9-5에서 x1, y1 좌표를 구하는 방법에서는 큰 문제가 발생하지 않는다. 즉, x1y1은 항상 0보다 같거나 크고, w와 h보다는 작은 값으로 결정된다. 그러나 x2y2w 또는 h와 같아질 가능성이 있기 때문에, if 문을 이용하여 값의 범위를 검사해주어야 한다. 소스 9-5에서는 x2y2가 영상의 크기를 벗어난 픽셀을 참조할 때에는 맨 가장자리의 픽셀 값을 참조하도록 하였다.

그림 9-10은 양선형 보간법을 이용하여 영상을 확대한 결과를 보여준다. 이 그림에서 영상의 확대 비율은 그림 9-7에서와 마찬가지로, 256×256 크기의 원본 영상을 각각 1024×1024와 2048×2048의 크기로 확대하였다. 양선형 보간법에 의해 확대된 영상들은 앞에서 설명한 최근방 이웃 보간법에 비하여 계단 현상이 현저하게 없어지고, 영상의 윤곽선이 많이 부드러워진 것을 볼 수 있다.

그림 9-10 양선형 보간법을 이용한 영상의 확대
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.