더북(TheBook)

그러면 실제 영상의 밝기 조절을 수행하는 함수를 만들어보자. 밝기 조절 함수의 이름은 IppBrighness를 사용하기로 하고, 함수의 구현은 6.1절에서 만든 IppInverse 함수와 마찬가지로 IppEnhance.h와 IppEnhance.cpp 파일에 하도록 하자. 먼저 다음과 같은 함수의 선언을 IppEnhance.h 파일에 추가하자.

void IppBrightness(IppByteImage& img, int n);

IppBrightness 함수는 IppByteImage 객체의 참조형인 img와 밝기 조절 정도를 나타내는 정숫값 n을 인자로 받는다. 밝기 조절 결과는 다시 img에 저장된다. IppBrightness 함수의 전체 내용은 소스 6-5에 나타내었다.

소스 6-5 영상의 밝기 조절 함수(IppEnhance.cpp)
void IppBrightness(IppByteImage& img, int n)
{
    int size = img.GetSize();
    BYTE* p = img.GetPixels();

    for (int i = 0; i < size; i++)
    {
        p[i] = limit(p[i] + n);
    }
}

IppBrightness 함수의 내부 구조는 6.1절에서 만든 IppInverse 함수와 상당히 유사하다. 소스 6-5에서 주의 깊게 보아야 할 부분은 for 루프 안에서 사용된 limit 함수이다. 이 함수는 그레이스케일 값이 0보다 작아지거나, 255보다 커지는 경우를 방지하는 역할을 한다. 이 함수가 필요한 이유는 밝기 조절 결괏값이 0보다 작거나 255보다 큰 값이 될 경우, BYTE 타입의 변수 p[i]에 예상치 않은 값이 저장될 수 있기 때문이다. 예를 들어 기존의 그레이스케일 값이 250이고 10만큼 밝기를 밝게 조절할 경우, 최종 그레이스케일 값은 260이 되지만, BYTE 타입의 변수에 저장될 때에는 4라는 값이 되어버린다. 이는 컴퓨터에서 BYTE 타입이 가질 수 있는 값의 범위가 0부터 255 사이로 제한되어 있기 때문이다. 반대로 밝기를 어둡게 변경하다 보면 픽셀 값이 0보다 작아지는 경우도 발생할 수 있어서 이에 대한 처리로 limit 함수가 필요한 것이다.

그림 6-10은 limit 함수의 유무에 따른 밝기 조절 결과를 보여준다. 그림 6-10(a)는 입력 영상인 lenna.bmp 파일이다. 그림 6-10(b)는 입력 영상의 밝기 값을 limit 함수를 사용하지 않고 40만큼 증가시킨 결과 영상이다. 빨간색 원으로 표시한 부분들의 값이 극명하게 잘못된 것을 알 수 있다. 그림 6-10(C)는 limit 함수를 사용하여 밝기 값을 조절한 결과이다. 똑같이 40만큼의 밝기 값을 증가시켰으나, 어색한 부분 없이 영상을 밝게 만든 것을 볼 수 있다.

그림 6-10 밝기 조절 시 limit 함수의 사용 여부에 따른 결과 영상의 차이
(a) 입력 영상
(b) limit 함수 미사용
(c) limit 함수 사용]
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.