더북(TheBook)

8.3.3 하이부스트 필터

언샤프 마스크 필터의 수정된 형태로 하이부스트 필터high-boost filter라는 것이 있다. 하이부스트 필터는 입력 영상의 명암비를 전체적으로 높여줌과 동시에 엣지를 강조함으로써 전체적으로 더욱 선명한 느낌이 드는 결과 영상을 생성한다. 하이부스트 필터는 다음과 같은 수식으로 정의된다.

h(x, y) = α·f(x, y) + ∇2 f(x, y)

위 수식에서 보통 α는 1보다 같거나 큰 실수로 정의하며, 입력 영상의 명암비를 다소 높여주면서 밝기를 전반적으로 밝게 만들어주는 역할을 한다. 만약 α가 1이면 앞서 설명한 언샤프 마스크 필터와 완전히 동일해진다.

그림 8-22는 하이부스트 필터의 실행 결과의 예를 보여준다. 그림 8-22(a)는 입력 영상인 columbia.bmp 파일이며, 전체적으로 약간 어두운 영상이다. 그림 8-22(b)는 α=1인 경우이며 언샤프 마스크 필터와 완전히 동일하다. 그림 8-22(C)는 α=1.5인 경우의 하이부스트 필터링 결과 영상이다. 눈으로 보기에 하이부스트 필터를 거친 영상이 더 선명하고 뚜렷한 느낌을 가지게 되는 것을 볼 수 있다.

그림 8-22 하이부스트 필터의 적용 결과
(a) 입력 영상
(b) α = 1
(c) α = 1.5

하이부스트 필터의 구현은 상당히 간단하다. 앞에서 설명한 소스 8-9의 언샤프 마스크 필터 함수에서 for 루프 안의 문장을 다음과 같이 바꿔주기만 하면 된다.

float sum;
sum = (5 + a) * pSrc[j][i]
       - pSrc[j - 1][i] - pSrc[j][i - 1] - pSrc[j + 1][i] - pSrc[j][i + 1];

pDst[j][i] = static_cast<BYTE>(limit(sum + 0.5f));

여기서 변수 a는 하이부스트 필터 수식에서 설명한 α에 해당하는 변수로써, 실수형으로 선언하면 된다. 결과적으로 sum 변수도 실수형으로 변경해야 하며, 실제 결과 영상의 픽셀 값에 대입할 때에는 0.5를 더해준 후 정수형으로 형변환하여 반올림 효과를 갖도록 하는 것이 좋다. 이렇게 수정하여 완성한 하이부스트 필터 구현 함수를 소스 8-10에 나타내었다. IppFilterHighboost 함수의 선언은 IppFilter.h 파일에 여러분이 직접 입력하기 바란다.

소스 8-10 하이부스트 필터 구현 함수(IppFilter.cpp)
void IppFilterHighboost(IppByteImage& imgSrc, IppByteImage& imgDst, float alpha)
{
    int w = imgSrc.GetWidth();
    int h = imgSrc.GetHeight();

    imgDst = imgSrc;

    BYTE** pSrc = imgSrc.GetPixels2D();
    BYTE** pDst = imgDst.GetPixels2D();

    int i, j;
    float sum;
    for (j = 1; j < h - 1; j++)
    for (i = 1; i < w - 1; i++)
    {
        sum = (4 + alpha) * pSrc[j][i]
               - pSrc[j - 1][i] - pSrc[j][i - 1] - pSrc[j + 1][i] - pSrc[j][i + 1];
        pDst[j][i] = static_cast<BYTE>(limit(sum + 0.5f));
    }
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.