IppFilterDiffusion 함수는 입력 영상 imgSrc에 대해 비등방성 확산 필터링을 수행하고, 그 결과를 imgDst에 저장한다. IppFilterDiffusion 함수의 세 번째 인자 lambda와 네 번째 인자 k는 비등방성 확산 수식에서 사용되는 λ와 K를 의미한다. 비등방성 필터링 구현 시 내부적으로 같은 동작을 여러 번 반복하는데, 그 반복 횟수를 다섯 번째 인자 iter로 받는다. IppFilterDiffusion 함수를 사용할 경우 전달해야 하는 인자의 값은 lambda = 0.25, k = 4를 유지하는 것이 바람직하며, iter 값은 4~30 정도가 적합하다. IppFilterDiffusion 함수의 구현은 소스 8-18에 나타내었다.

    소스 8-18 비등방성 확산 필터 구현 함수(IppFilter.cpp)
    void IppFilterDiffusion(IppByteImage& imgSrc, IppFloatImage& imgDst, float lambda, float k, int iter)
    {
        int w = imgSrc.GetWidth();
        int h = imgSrc.GetHeight();
    
        IppFloatImage imgCpy;
        imgCpy.Convert(imgSrc);
    
        imgDst = imgCpy;
    
        float** pCpy = imgCpy.GetPixels2D();
        float** pDst = imgDst.GetPixels2D();
    
        //-------------------------------------------------------------------------
        // iter 횟수만큼 비등방성 확산 알고리즘 수행
        //-------------------------------------------------------------------------
    
        register int i, x, y;
        float gradn, grads, grade, gradw;
        float gcn, gcs, gce, gcw;
        float k2 = k * k;
    
        for (i = 0; i < iter; i++)
        {
            for (y = 1; y < h - 1; y++)
            for (x = 1; x < w - 1; x++)
            {
                gradn = pCpy[y - 1][x] - pCpy[y][x];
                grads = pCpy[y + 1][x] - pCpy[y][x];
                grade = pCpy[y][x - 1] - pCpy[y][x];
                gradw = pCpy[y][x + 1] - pCpy[y][x];
    
                gcn = gradn / (1.0f + gradn * gradn / k2);
                gcs = grads / (1.0f + grads * grads / k2);
                gce = grade / (1.0f + grade * grade / k2);
                gcw = gradw / (1.0f + gradw * gradw / k2);
    
                pDst[y][x] = pCpy[y][x] + lambda * (gcn + gcs + gce + gcw);
            }
    
            // 버퍼 복사
            if (i < iter - 1)
                memcpy(imgCpy.GetPixels(), imgDst.GetPixels(), sizeof(float) * w * h);
        }
    }
    
    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.