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

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