더북(TheBook)
소스 10-14 주파수 공간에서의 필터링 관련 메뉴 이벤트 처리 함수(ImageToolDoc.cpp)
#include "FreqFilteringDlg.h"

void CImageToolDoc::OnFreqFiltering()
{
    int w = m_Dib.GetWidth();
    int h = m_Dib.GetHeight();

    if (!IsPowerOf2(w) || !IsPowerOf2(h))
    {
        AfxMessageBox(_T("가로 또는 세로의 크기가 2의 승수가 아닙니다."));
        return;
    }

    CFreqFilteringDlg dlg;
    dlg.m_strRange.Format(_T("(0 ~ %d)"), _ _min(w / 2, h / 2));
    if (dlg.DoModal() == IDOK)
    {
        CWaitCursor wait;
        CONVERT_DIB_TO_BYTEIMAGE(m_Dib, img)

        IppFourier fourier;
        fourier.SetImage(img);
        fourier.FFT(1);

        if (dlg.m_nFilterType == 0)
        {
            if (dlg.m_nFilterShape == 0)
                fourier.LowPassIdeal(dlg.m_nCutoff);
            else
                fourier.LowPassGaussian(dlg.m_nCutoff);
        }
        else
        {
            if (dlg.m_nFilterShape == 0)
                fourier.HighPassIdeal(dlg.m_nCutoff);
            else
                fourier.HighPassGaussian(dlg.m_nCutoff);
        }

        fourier.FFT(-1);

        IppByteImage img2;
        fourier.GetImage(img2);
        CONVERT_IMAGE_TO_DIB(img2, dib)

        TCHAR* type[] = { _T("저역 통과 필터"), _T("고역 통과 필터") };
        TCHAR* shape[] = { _T("이상적(Ideal)"), _T("가우시안(Gaussian)") };
        AfxPrintInfo(_T("[주파수 공간 필터링] 입력 영상: %s, 필터 종류: %s, 필터 모양: %s,
            차단 주파수: %d"),
            GetTitle(), type[dlg.m_nFilterType], shape[dlg.m_nFilterShape], dlg.m_nCutoff);
        AfxNewBitmap(dib);
    }
}

소스 10-14의 OnFreqFiltering 함수의 코드가 상당히 긴 편이다. 아무래도 이 함수 하나에서 네 가지 형태의 주파수 공간 필터링을 동작시키기 때문이다. 그러나 대화 상자를 띄우는 부분이나 대화 상자 입력 값을 이용하여 필터링 관련 함수를 호출하는 구문 등이 대체로 직관적이기 때문에 분석이 그리 어렵지는 않을 것이다.