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