더북(TheBook)

그러면 실제 언샤프 마스크 필터링을 수행하는 함수를 작성해보자. 또한, 언샤프 마스크 필터를 설명하면서 같이 설명하였던 라플라시안 필터도 함께 작성해보자. 두 함수의 이름은 각각 IppFilterUnsharpMaskIppFilterLaplacian을 사용하기로 하고, IppFilter.h 파일에 아래와 같이 함수 선언을 추가하자.

void IppFilterLaplacian(IppByteImage& imgSrc, IppByteImage& imgDst);
void IppFilterUnsharpMask(IppByteImage& imgSrc, IppByteImage& imgDst);

두 함수 모두 입력 영상 imgSrc에 대해 필터링을 수행하고, 그 결과를 imgDst에 저장한다. IppFilterLaplacian 함수와 IppFilterUnsharpMask 함수의 전체 구현은 소스 8-8과 소스 8-9에 각각 나타내었다.

소스 8-8 라플라시안 필터 구현 함수(IppFilter.cpp)
void IppFilterLaplacian(IppByteImage& imgSrc, IppByteImage& imgDst)
{
    int w = imgSrc.GetWidth();
    int h = imgSrc.GetHeight();

    imgDst.CreateImage(w, h);

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

    int i, j, sum;
    for (j = 1; j < h - 1; j++)
    for (i = 1; i < w - 1; i++)
    {
        sum = pSrc[j - 1][i] + pSrc[j][i - 1] + pSrc[j + 1][i] + pSrc[j][i + 1]
            - 4 * pSrc[j][i];

        pDst[j][i] = static_cast<BYTE>(limit(sum + 128));
    }
}
소스 8-9 언샤프 마스크 필터 구현 함수(IppFilter.cpp)
void IppFilterUnsharpMask(IppByteImage& imgSrc, IppByteImage& imgDst)
{
    int w = imgSrc.GetWidth();
    int h = imgSrc.GetHeight();

    imgDst = imgSrc;

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

    int i, j, sum;
    for (j = 1; j < h - 1; j++)
    for (i = 1; i < w - 1; i++)
    {
        sum = 5 * 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));
    }
}

IppFilterLaplacian 함수와 IppFilterUnsharpMask 함수는 앞서 평균 값 필터를 구현할 때와 달리 마스크 배열을 따로 정의하여 사용하지 않았다. 대신 for 루프 안에서 4방향에 대한 픽셀 값을 직접 참조하여 결과 픽셀 값을 계산하였다. IppFilterLaplacian 함수에서는 결과 영상을 새로 생성함으로써 모든 픽셀 값을 0으로 초기화하였다. 라플라시안 필터 수행 시 최외곽 픽셀은 for 루프 연산에서 제외되기 때문에, 결과 영상의 최외곽 픽셀은 검정색으로 나타날 것임을 예상할 수 있다.

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