더북(TheBook)

소스 10-8의 FFT 함수 시작 부분에서는 입력 데이터의 가로, 세로 크기가 2의 승수인지를 확인하는 코드가 들어가 있다.

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

이때 사용한 IsPowerOf2 함수는 IppFourier.cpp 파일에 전역 함수의 형태로 정의되어 있다. IsPowerOf2 함수는 정수형 인자를 하나 전달받는데, 그 인자의 값이 2의 승수이면 true를 반환하고, 2의 승수가 아니면 false를 반환한다. 고속 이산 푸리에 변환 알고리즘은 입력 영상의 가로 크기와 세로 크기가 모두 2의 승수이어야만 동작하기 때문에 이를 확인하는 작업은 필수적이다. 만약 가로 또는 세로 픽셀의 크기가 2의 승수가 아니면 return 문장을 실행되며 FFT 함수는 종료된다. IsPowerOf2 함수의 실제 구현은 소스 10-9에 나타내었으며, 코드에 대한 자세한 설명은 생략한다.

소스 10-9 IsPowerOf2 함수의 구현(IppFourier.cpp)
bool IsPowerOf2(int n)
    {
        int ref = 1;
  
        while (ref < n)
            ref <<= 1;

        if (ref == n)
            return true;
        else
            return false;
}

만약 입력 영상의 가로, 세로 크기가 2의 승수가 아닌 경우에는 특별한 테크닉을 이용하여 고속 푸리에 변환 알고리즘을 사용할 수 있다. 가로 및 세로 크기가 2의 승수가 아닐 경우에는 각 변의 크기를 2의 승수 크기로 확대한다. 이때 영상의 픽셀 값을 보간법을 이용하여 크기 변환을 하는 것이 아니라 새로 나타나는 부분은 모두 픽셀 값을 0으로 채운다. 이를 제로 패딩zero padding이라고 부른다. 이처럼 2의 승수 형태로 확대한 후 FFT 알고리즘을 적용할 수 있다.

그림 10-14는 이러한 제로 패딩을 이용한 고속 푸리에 변환의 예를 보여준다. 입력 영상인 junsung.bmp 파일의 크기는 320×240이다. 가로 픽셀의 크기 320보다 큰 2의 승수는 512이고, 240보다 큰 2의 승수는 256이다. 그러므로 원본 영상을 512×256의 크기로 키우면서 새로 나타나는 픽셀은 모두 픽셀 값을 0으로 채운다. 그러면 이 영상을 고속 푸리에 변환 알고리즘을 이용하여 주파수 공간으로 바꿀 수 있다. 이 후, 주파수 공간에서 필터링 등의 영상 처리를 한 후에 다시 고속 푸리에 역변환을 하면 원본 영상의 부분에 영상 처리 결과가 기록이 된다. 맨 마지막에 다시 원본 영상의 크기만큼을 잘라내면 임의의 크기의 영상들도 고속 푸리에 변환을 이용하여 주파수 공간에서의 처리를 할 수 있게 된다.

그림 10-14 제로 패딩을 이용한 영상의 FFT 변환
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.