더북(TheBook)

10.3.2 2차원 영상의 고속 푸리에 변환

2차원 영상을 고속 푸리에 변환 알고리즘을 이용하여 주파수 공간으로 바꾸어보자. 이미 1차원 데이터를 고속 푸리에 변환하는 함수를 가지고 있기 때문에 2차원 영상을 변환하는 방법은 매우 쉽게 구현될 수 있다.

10.2절에서 이산 푸리에 변환을 행과 열을 따로 분리하여 수행할 수 있음을 배웠다. 이때 사용한 함수가 DFTRC 함수였으며, 이 함수에서는 영상의 각 행을 DFT1d 함수를 이용하여 변환한 후 다시 각 열을 DFT1d 함수를 이용하여 변환하였다. 영상을 고속 푸리에 변환 알고리즘을 사용하여 주파수 공간으로 변경하고자 할 경우, DFTRC 함수 내부에 있는 DFT1d 함수를 FFT1d 함수로 교체하기만 하면 구현이 완성된다. 소스 10-8은 2차원 영상을 고속 푸리에 변환 알고리즘을 이용하여 주파수 공간으로 변환하는 FFT 멤버 함수의 정의를 보여준다. 함수의 인자 dir은 푸리에 변환 방향을 지시한다.

소스 10-8 2차원 영상에 대한 FFT 구현 함수(IppFourier.cpp)
void IppFourier::FFT(int dir)
{
    if (!real.IsValid())
        return;

    if (!IsPowerOf2(width) || !IsPowerOf2(height))
        return;

    //-------------------------------------------------------------------------
    // 행(Row) 단위 이산 푸리에 변환 (또는 역변환)
    //-------------------------------------------------------------------------

    IppDoubleImage real_tmp, imag_tmp;

    real_tmp.CreateImage(width, 1);
    imag_tmp.CreateImage(width, 1);

    double* re = real_tmp.GetPixels();
    double* im = imag_tmp.GetPixels();

    double** pRe = real.GetPixels2D();
    double** pIm = imag.GetPixels2D();

    register int i, j;

    for (j = 0; j < height; j++)
    {
        for (i = 0; i < width; i++)
        {
            re[i] = pRe[j][i];
            im[i] = pIm[j][i];
        }

        FFT1d(re, im, width, dir);

        for (i = 0; i < width; i++)
        {
            pRe[j][i] = re[i];
            pIm[j][i] = im[i];
        }
    }

    //-------------------------------------------------------------------------
    // 열(Column) 단위 이산 푸리에 변환 (또는 역변환)
    //-------------------------------------------------------------------------

    real_tmp.CreateImage(height, 1);
    imag_tmp.CreateImage(height, 1);

    re = real_tmp.GetPixels();
    im = imag_tmp.GetPixels();

    memset(re, 0, sizeof(double) * height);
    memset(im, 0, sizeof(double) * height);

    for (i = 0; i < width; i++)
    {
        for (j = 0; j < height; j++)
        {
            re[j] = pRe[j][i];
            im[j] = pIm[j][i];
        }

        FFT1d(re, im, height, dir);

        for (j = 0; j < height; j++)
        {
            pRe[j][i] = re[j];
            pIm[j][i] = im[j];
        }
    }
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.