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