더북(TheBook)

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);
    }
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.