더북(TheBook)

10.2.2 2차원 영상의 푸리에 변환 구현

10.1절에서 1차원 데이터에 대한 이산 푸리에 변환 함수를 IppFourier.h와 IppFourier.h 파일에 구현하였다. 이제 2차원 영상에 대한 이산 푸리에 변환을 구현해보자. 2차원 영상에 대한 푸리에 변환에서는 단순히 입력 데이터만 처리하는 것뿐만 아니라, 푸리에 스펙트럼과 위상각을 그레이스케일 영상 형태로 보여주는 작업도 수행할 것이다. 또한 이 장의 남은 절에서는 이산 푸리에 변환을 빠르게 구현하는 방법과 주파수 공간에서의 필터링 방법까지 알아볼 것이다. 이와 같이 2차원 영상의 이산 푸리에 변환을 위해서는 수행해야 할 것들이 많기 때문에 2차원 영상의 푸리에 변환은 함수 단위로 구현하지 않고 새로운 클래스를 만들어 구현할 것이다.

새로 만들 클래스의 이름은 IppFourier이며, 이 클래스는 앞에서 생성한 IppFourier.h와 IppFourier.cpp 파일에 각각 구현할 것이다. 먼저 IppFourier.h 파일에 IppFourier 클래스의 정의를 추가하자. IppFourier 클래스의 정의는 소스 10-3에 나타내었다.

소스 10-3 IppFourier 클래스의 정의(IppFourier.h)
#pragma once
  
#include "IppImage.h"

class IppFourier
{
public:
    int width;
    int height;
    IppDoubleImage real; // 실수부
    IppDoubleImage imag; // 허수부
  
public:
    IppFourier();

    void SetImage(IppByteImage& img);
    void GetImage(IppByteImage& img);
    void GetSpectrumImage(IppByteImage& img);
    void GetPhaseImage(IppByteImage& img);

    // 영상의 푸리에 변환 함수
    void DFT(int dir);
    void DFTRC(int dir);
    void FFT(int dir);

    // 주파수 공간에서의 필터링 함수
    void LowPassIdeal(int cutoff);
    void HighPassIdeal(int cutoff);
    void LowPassGaussian(int cutoff);
    void HighPassGaussian(int cutoff);
};

// 전역 함수 선언
void DFT1d(double* re, double* im, int N, int dir);
void FFT1d(double* re, double* im, int N, int dir);
bool IsPowerOf2(int n);

소스 10-3의 IppFourier 클래스 정의에서는 앞으로 이 장에서 구현할 모든 멤버 변수와 멤버 함수의 선언을 포함하고 있으며, 일부 전역 함수의 선언도 표시해주고 있다. 소스 10-3에 선언된 전역 함수 중에서 DFT1d 함수는 이미 10.1절에서 설명한 함수이다. 나머지 두 전역 함수는 10.3절에서 설명할 것이다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.