더북(TheBook)

그러면 실제 가중 평균 값 필터를 수행하는 함수를 작성해보자. 함수의 이름은 IppFilter WeightedMean을 사용하기로 하고, IppFilter.h 파일에 아래와 같이 함수 선언을 추가하자.

void IppFilterWeightedMean(IppByteImage& imgSrc, IppByteImage& imgDst);

IppFilterWeightedMean 함수는 입력 영상 imgSrc에 대해 3×3 크기의 마스크를 이용한 가중 평균 값 필터링을 수행하고, 그 결과를 imgDst에 저장한다. IppFilterWeightedMean 함수의 전체 구현은 소스 8-3에 나타내었다. IppFilterWeightedMean 함수는 앞서 살펴봤던 평균 값 필터 함수 IppFilterMean과 그 구조가 거의 유사하다. 다만 mask 배열 값에서만 차이가 있을 뿐이다.

소스 8-3 가중 평균 값 필터 구현 함수(IppFilter.cpp)
void IppFilterWeightedMean(IppByteImage& imgSrc, IppByteImage& imgDst)
{
    int w = imgSrc.GetWidth();
    int h = imgSrc.GetHeight();

    imgDst = imgSrc;

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

    int mask[3][3] = {
        { 1, 2, 1 },
        { 2, 4, 2 },
        { 1, 2, 1 },
    };

    int i, j, m, n, sum;
    for (j = 1; j < h - 1; j++)
    for (i = 1; i < w - 1; i++)
    {
        sum = 0;
        for (m = 0; m < 3; m++)
        for (n = 0; n < 3; n++)
        {
            sum += (pSrc[j - 1 + m][i - 1 + n] * mask[m][n]);
        }

        pDst[j][i] = static_cast<BYTE>(limit(sum / 16. + 0.5));
    }
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.