더북(TheBook)

그러면 실제 영상의 덧셈 연산을 수행하는 함수를 작성해보자. 함수의 이름은 IppAdd를 사용하기로 하고, 함수의 구현은 6장에서 만들었던 함수들과 마찬가지로 IppEnhance.h와 IppEnhance.cpp 파일에 작성하도록 하자. 먼저 아래와 같은 함수 선언을 IppEnhance.h 파일에 추가하자.

bool IppAdd(IppByteImage& img1, IppByteImage& img2, IppByteImage& img3);

IppAdd 함수는 세 개의 인자를 가지고 있으며, 모두 IppByteImage 클래스의 참조형으로 선언되어 있다. img1img2는 덧셈 연산의 입력 영상이며, img3은 덧셈 연산을 수행한 결과가 저장될 영상이다. IppAdd 함수의 구현은 소스 7-1에 나타내었다.

소스 7-1 덧셈 연산의 구현(IppEnhance.cpp)
bool IppAdd(IppByteImage& img1, IppByteImage& img2, IppByteImage& img3)
{
    int w = img1.GetWidth();
    int h = img1.GetHeight();

    if (w != img2.GetWidth() || h != img2.GetHeight())
        return false;

    img3.CreateImage(w, h);

    int size = img3.GetSize();
    BYTE* p1 = img1.GetPixels();
    BYTE* p2 = img2.GetPixels();
    BYTE* p3 = img3.GetPixels();

    for (int i = 0; i < size; i++)
    {
        p3[i] = limit(p1[i] + p2[i]);
    }

    return true;
}

IppAdd 함수의 시작 부분에서는 if 문을 사용하여 입력으로 들어오는 두 영상 img1img2의 가로와 세로 크기를 비교한다. 만약 두 입력 영상의 크기가 같지 않으면 덧셈 연산을 하지 않고 false를 반환하며 함수를 종료한다. 즉, IppAdd 함수는 두 입력 영상의 크기가 동일할 때에만 동작한다. 입력 영상들의 크기를 확인한 후에는 입력 영상과 동일한 크기의 영상 img3을 새로 생성한다. 그리고 for 루프를 이용하여 모든 픽셀에 대하여 덧셈 연산을 수행한다. 이때 limit 함수를 사용하여 두 픽셀의 그레이스케일 값의 합이 255보다 커지면 그레이스케일 최댓값인 255를 갖도록 설정하였다. for 루프가 끝난 후에는 true 값을 반환함으로써 함수가 정상적으로 종료하였음을 명시하였다.

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