03 장 영상처리를위한 Visual C++ 디지털영상파일포맷 MFC AppWizard[exe] 를이용한 MFC 프로젝트작성 MFC 를이용한영상처리입. 출력프로그램작성 MFC 를이용한영상축소 MFC 를이용한영상확대 MFC 를이용한양자화영상처리 한빛미디어 ( 주 )
학습목표 3 장. 영상처리를위한 Visual C++ 영상처리에사용되는 RAW 파일포맷을이해한다. MFC AppWizard[exe] 를이용한영상처리프로그램기법을익힌다. MFC의기본구조를이해한다. 2
Section 01 디지털영상파일포맷 영상파일포맷의종류 : BMP, JPEG, RAW, GIF, PSD, TIFF 등 BMP, JPEG 파일포맷 영상의색상정보, 해상도등을알수있는정보가헤더 (Header) 에포함되어있음 추가작업이필요해프로그램이더복잡해짐. RAW 파일포맷 헤더정보없이완전한데이터만으로구성 복잡한헤더정보를해석할필요가없어영상처리가복잡하지않음. 헤더정보가없어영상의색상정보나해상도정보를사용자가미리알아야하는단점이있음. 3
Raw 와 BMP 파일구조 4
[ 실습하기 3-1] MFC AppWizard[exe] 를이용한 MFC 프로젝트작성 1 [ 시작 ] 버튼클릭 [ 프로그램 ]-[Microsoft Visual Studio 6.0]-[Microsoft Visual C++ 6.0] 메뉴클릭 Visual C++ 시작화면에서 [File]- [New] 메뉴클릭 2 [New] 대화상자의 [Project] 탭에서 MFC AppWizard [exe] 항목클릭 Project name 란에작성할프로그램이름입력, Location 항목에프로그램을저장할위치지정 5
[ 실습하기 3-1] MFC AppWizard[exe] 를이용한 MFC 프로젝트작성 3 [MFC AppWizard] 대화상자에서프로그램을어떤기반으로작성할것인지를결정 지원하는언어선택 4 [MFC AppWizard] 대화상자의 2 단계에서데이터베이스기능사용여부를 None 으로선택 6
[ 실습하기 3-1] MFC AppWizard[exe] 를이용한 MFC 프로젝트작성 5 [MFC AppWizard] 대화상자의 3 단계에서 OLE 기능의사용여부를 None 으로선택 6 [MFC AppWizard] 대화상자의 4 단계에서메인프레임의디자인과부가기능을설정하기위해 [Advanced] 버튼클릭 7
[ 실습하기 3-1] MFC AppWizard[exe] 를이용한 MFC 프로젝트작성 7 [Advanced Option] 대화상자에서는불러올영상파일의확장자를디지털영상처리에서기본파일포맷인 raw 로지정 8 [MFC AppWizard] 대화상자의 5 단계에서프로그램의스타일설정 주석문을자동으로삽입할것인지를결정 8
[ 실습하기 3-1] MFC AppWizard[exe] 를이용한 MFC 프로젝트작성 9 [MFC AppWizard] 대화상자의마지막 6 단계에서생성된기본클래스의정보확인 10 [New Project Information] 대화상자에서설정정보확인 [OK] 버튼을클릭 9
[ 실습하기 3-1] MFC AppWizard[exe] 를이용한 MFC 프로젝트작성 11 새창이실행되고 Workspace, Edit, Debug 영역이모두활성화됨. 여기에서프로그램작성을시작하면됨 ➊ ➋ ➍ ➎ ➏ ➌ 10
[ 실습하기 3-1] MFC AppWizard[exe] 를이용한 MFC 프로젝트작성 ➊ Workspace : 윈도우탐색기와같은역할. 클래스, 대화상자, 파일확인가능 ➋ Edit : 프로그램을작성하는부분 ➌ Debug : 오류발생시경고및오류정보를표시 ➍~ ➏ Workspace : ClassView, ResourceView, FileView 영역으로다시나뉨 ➍ ClassView ➎ ResourceView ➏ FileView 11
디지털영상을처리하려면 디지털영상을처리하려면 디지털영상을 Visual C++ 로입력받은뒤일정한루틴따라처리한후그결과를다시디지털영상파일로저장하는과정이필요. RAW 포맷의디지털영상에는 0~255 로구성된 8 비트그레이레벨이있어 C 언어의 unsigned char(0~255, 8 비트 ) 로저장가능 디지털영상처리의입력이나출력값은모두정수형이지만, 다양한처리과정에서실수값이나올수도있음. 이때는입력영상의데이터값을실수형 (double) 로전환하여영상을처리해야데이터가손실되지않음. OnOpenDocument 함수를이용한파일입력 영상데이터를파일에서읽어오려면 OnOpenDocument 함수를재정의해야함. OnOpenDocument 함수는 [ 파일 ]-[ 열기 ] 메뉴를클릭하면파일을입력받을수있는대화상자를실행시키는역할수행 12
[ 실습하기 3-1] OnOpenDocument 함수를이용한파일입력프로그램 1 Visual C++ 프로그램에서 [View]-[ClassWizard] 메뉴를클릭 [MFC ClassWizard] 대화상자에서다음과같이지정 [Add Function] 버튼클릭 CImageProcessingDoc 클래스가함수에추가됨 13
[ 실습하기 3-1] OnOpenDocument 함수를이용한파일입력프로그램 2 Member functions 항목에 OnOpenDocument 함수가추가됐는지확인 [Edit Code 버튼 ] 버튼 OnOpenDocument 함수로이동 14
[ 실습하기 3-1] OnOpenDocument 함수를이용한파일입력프로그램 3 OnOpenDocument 함수가다음과같은형태로추가됨. 여기서프로그램을추가하여영상데이터를입력하게됨 BOOL CImageProcessingDoc::OnOpenDocument(LPCTSTR lpszpathname) { if(!cdocument::onopendocument(lpszpathname)) return FALSE; // TODO: Add your specialized creation code here return TRUE; 15
[ 실습하기 3-1] OnOpenDocument 함수를이용한파일입력프로그램 4 영상을입력받으려면변수를추가해야함. 영상데이터를저장하는변수, 영상의가로축과세로축크기변수를지정해야함. CImageProcessingDoc 에변수를추가하기위해 ClassView Workspace 창으로이동 16
[ 실습하기 3-1] OnOpenDocument 함수를이용한파일입력프로그램 5 OnOpenDocument 로이동하여함수재정의 BOOL CImageProcessingDoc::OnOpenDocument(LPCTSTR lpszpathname) { if (!CDocument::OnOpenDocument(lpszPathName)) return FALSE; CFile File; // 파일객체선언 File.Open(lpszPathName, CFile::modeRead CFile::typeBinary); // 파일열기대화상자에서선택한파일을지정하고읽기모드선택 // 이책에서는영상의크기 256*256, 512*512, 640*480 만을사용한다. if(file.getlength() == 256*256){ // RAW 파일의크기결정 m_height = 256; m_width = 256; else if(file.getlength() == 512*512){ // RAW 파일의크기결정 m_height = 512; m_width = 512; else if(file.getlength() == 640*480){ // RAW 파일의크기결정 m_height = 480; m_width = 640; else{ AfxMessageBox("Not Support Image Size"); // 해당크기가없는경우 return 0; m_size = m_width * m_height; // 영상의크기계산 m_inputimage = new unsigned char [m_size]; // 입력영상의크기에맞는메모리할당 for(int i = 0 ; i<m_size ; i++) m_inputimage[i] = 255; // 초기화 File.Read(m_InputImage, m_size); // 입력영상파일읽기 File.Close(); // 파일닫기 return TRUE; 17
[ 실습하기 3-1] OnOpenDocument 함수를이용한파일입력프로그램 6 CImageProcessingView 클래스로이동하여 OnDraw 함수를재정의하여영상 데이터를출력함. void CImageProcessingView::OnDraw(CDC* pdc) { CImageProcessingDoc* pdoc = GetDocument(); // 도큐먼트클래스참조 ASSERT_VALID(pDoc); int i, j; unsigned char R, G, B; for(i=0 ; i<pdoc->m_height ; i++){ for(j=0 ; j<pdoc->m_width ; j++){ R = G = B = pdoc->m_inputimage[i*pdoc->m_width+j]; pdc->setpixel(j+5, i+5, RGB(R, G, B)); 18
[ 실습하기 3-1] OnOpenDocument 함수를이용한파일입력프로그램 7 결과영상 19
Section 03 MFC 를이용한영상처리입출력프로그램작성 OnSaveDocument 함수를이용한파일출력 Visual C++ 에서처리된영상데이터는 1 차원이나 2 차원형태의배열데이터로존재함. 이배열데이터를확장자가 raw 인파일로출력하려면프로그램이필요한데, 이것을지원하는함수가바로 OnSaveDocument 20
[ 실습하기 3-3] OnSaveDocument 함수를이용한파일출력프로그램 1 Visual C++ 프로그램에서 [View]-[ClassWizard] 메뉴클릭 [MFC ClassWizard] 대화상자에서다음과같이지정 [Add Function] 버튼클릭하여 OnSaveDocument 클래스를함수에추가 21
[ 실습하기 1-1] OnSaveDocument 함수를이용한파일출력프로그램 2 Member functions 항목에 OnSaveDocument 가추가된것확인 [Edit Code] 버튼을클릭해 OnSaveDocument 함수이동 3 OnSaveDocument 함수가다음과같은형태로추가됨. 여기에프로그램을추가하여영상데이터를파일로출력함. BOOL CImageProcessingDoc::OnSaveDocument(LPCTSTR lpszpathname) { // TODO: Add your specialized code here and/or call the base class return CDocument::OnSaveDocument(lpszPathName); 22
[ 실습하기 3-3] OnSaveDocument 함수를이용한파일출력프로그램 4 OnSaveDocument 함수를재정의함. BOOL CImageProcessingDoc::OnSaveDocument(LPCTSTR lpszpathname) { CFile File; // 파일객체선언 CFileDialog SaveDlg(FALSE, "raw", NULL, OFN_HIDEREADONLY); // raw 파일을다른이름으로저장하기를위한대화상자객체선언 if(savedlg.domodal() == IDOK){ // DoModal 멤버함수에서저장하기수행 File.Open(SaveDlg.GetPathName(), CFile::modeCreate CFile::modeWrite); // 파일열기 File.Write(m_InputImage, m_size); // 파일쓰기 File.Close(); // 파일닫기 return TRUE; 5 [ 저장 ] 버튼을클릭 [ 다른이름으로저장 ] 대화상자에서저장할파일이름을입력해프로그램저장 23
다운샘플링 (Down Sampling) Section 04 MFC 를이용한영상축소 디지털영상을축소하는가장간단한방법 다운샘플링은원영상의값을일정한좌표단위로버리는것. 디지털영상은 2 차원이므로수평축샘플링과수직축샘플링이모두되어야함. 24
[ 실습하기 3-4] 영상축소프로그램 1 Visual C++ 프로그램의 Workspace 창에서 [ResourceView] 탭클릭 [Menu]-[IDR_IMAGEPTYPE] 메뉴를더블클릭해 [ 도움말 ] 메뉴오른쪽에프레임메뉴를하나만듦 프레임메뉴위에서마우스오른쪽버튼을누르후 [Properties] 메뉴클릭 [Menu Item Properties] 대화상자에서다음과같이설정 [Enter] 클릭 ➊ ➋ Caption 설정 25
[ 실습하기 3-4] 영상축소프로그램 [ 영상처리 ] 메뉴아래에상자선택후바로가기메뉴 [Properties] 클릭 [Menu Item Properties] 대화상자에서 ID 와 Captions 를입력 생성된 [DownSample] 메뉴에서바로가기메뉴 [ClassWizard] 클릭 26
[ 실습하기 3-4] 영상축소프로그램 [MFC ClassWizard] 대화상자에서 Object Ids 항목을 ID_DOWN_SAMPLING, Message 항목을 COMMAND 로선택 <Add Function> 버튼클릭 27
[ 실습하기 3-4] 영상축소프로그램 2 [Add Member Fuction] 대화상자의 View Class 에서다운샘플링을담당할함수가생성됐는지확인 [OK] 버튼클릭 다시 [MFC ClassWizard] 대화상자에서 [Edit Code] 버튼을클릭해함수로이동 3 ResourceView 창에서 [ImageProcessing resources]-[dialog] 폴더선택 바로가기메뉴 [Insert Dialog] 클릭 새 [Dialog] 대화상자가추가됨. 28
[ 실습하기 3-4] 영상축소프로그램 4 Controls 도구상자를이용하여대화상자에샘플링비율을입력할수있도록대화상자편집 Static Text Edit Box Dialog 메뉴들의위치정렬, 크기, 미리보기기능 29
[ 실습하기 3-4] 영상축소프로그램 대화상자에삽입된각항목의속성 (Properties) 을다음과같이설정 30
[ 실습하기 3-4] 영상축소프로그램 5 [View]-[ClassWizard] 메뉴클릭 [MFC ClassWizard] 대화상자에서새로추가된대화상자를추가하기위해 [Adding a Class] 대화상자에서 Create a new class 항목을체크 [OK] 버튼클릭 [New Class] 대화상자에서다음과같이지정한뒤 [OK] 버튼클릭 ( 클래스이름앞에는반드시 C 를붙여주어야함 ) 클래스의이름을등록하면파일이름은자동으로생성됨. 31
[ 실습하기 3-4] 영상축소프로그램 6 [View]-[ClassWizard] 메뉴클릭 [MFC ClassWizard] 대화상자의 Object IDs 항목에서 DownSampleDlg 클래스를선택한뒤 [Member Variables] 탭클릭 다음과같이세부항목을지정한뒤 [Add Variable] 버튼클릭 [Add Member Variable] 대화상자에서다음과같이지정하고 [OK] 버튼클릭 다시 [MFC ClassWizard] 대화상자에서 IDE_EDIT1 항목을선택한뒤대화상자아래쪽의항목을이용해변수의최소값과최대값을지정 32
[ 실습하기 3-4] 영상축소프로그램 33
[ 실습하기 3-4] 영상축소프로그램 7 메인프레임에서 [ 영상처리 ]-[DownSample] 메뉴를클릭했을때실제로다운샘플링이발생하도록프로그램을작성해주어야함. 파일을입 출력때처럼 Doc 클래스에서실제로프로그램을작성하고, View 클래스가작성된프로그램을호출하여화면에출력할수있도록만듦 8 추가된대화상자를 Doc 클래스에서사용하려면다음과같은선언부분이필요함. ImageProcessingDoc.cpp 파일의윗부분에 DownSampleDlg.h 코드추가 #include "stdafx.h" #include "ImageProcessing.h" #include "ImageProcessingDoc.h" #include "DownSampleDlg.h" // 대화상자사용을위한헤더선언 34
[ 실습하기 3-4] 영상축소프로그램 9 Doc 클래스에 OnDownSampling 함수추가 ClassView Workspace 에서 CimageProcessingDoc 항목에서바로가기메뉴 [Add Member Variable] 를클릭 처리결과저장변수, 결과영상의가로축크기, 세로축크기지정변수등의사용할변수추가 35
[ 실습하기 3-4] 영상축소프로그램 다음과같이 OnDownSampling 함수작성 void CImageProcessingDoc::OnDownSampling() { int i, j; CDownSampleDlg dlg; if(dlg.domodal() == IDOK) // 대화상자의활성화여부 { m_re_height = m_height / dlg.m_downsamplerate; // 축소영상의세로길이를계산 m_re_width = m_width / dlg.m_downsamplerate; // 축소영상의가로길이를계산 m_re_size = m_re_height * m_re_width; // 축소영상의크기를계산 m_outputimage = new unsigned char [m_re_size]; // 축소영상을위한메모리할당 for(i=0 ; i<m_re_height ; i++){ for(j=0 ; j<m_re_width ; j++){ m_outputimage[i*m_re_width + j] = m_inputimage[(i*dlg.m_downsamplerate*m_width)+dlg.m_downsamplerate*j]; // 축소영상을생성 36
[ 실습하기 3-4] 영상축소프로그램 10 다음과같이 View 클래스의 OnDownSampling 함수작성 void CImageProcessingView::OnDownSampling() { // TODO: Add your command handler code here CImageProcessingDoc* pdoc = GetDocument(); // Doc 클래스참조 ASSERT_VALID(pDoc); pdoc->ondownsampling(); // Doc 클래스에 OnDownSampling 함수호출 Invalidate(TRUE); // 화면갱신 37
[ 실습하기 3-4] 영상축소프로그램 11 처리된결과를화면에표시하기위해 OnDraw 함수를다음과같이재정의 void CImageProcessingView::OnDraw(CDC* pdc) { CImageProcessingDoc* pdoc = GetDocument(); // Doc 클래스참조 ASSERT_VALID(pDoc); // TODO: add draw code for native data here int i, j; unsigned char R, G, B; // 입력영상출력 for(i = 0 ; i<pdoc->m_height ; i++){ for(j = 0 ; j<pdoc->m_width ; j++){ R = pdoc->m_inputimage[i*pdoc->m_width+j]; G = B = R; pdc->setpixel(j+5, i+5, RGB(R, G, B)); // 축소된영상출력 for(i = 0 ; i<pdoc->m_re_height ; i++){ for(j = 0 ; j<pdoc->m_re_width ; j++){ R = pdoc->m_outputimage[i*pdoc->m_re_width+j]; G = B = R; pdc->setpixel(j+pdoc->m_width+10, i+5, RGB(R, G, B)); 38
[ 실습하기 3-4] 영상축소프로그램 12 실행결과영상. 이후작성되는프로그램에서는결과영상을 m_outputimage 배열에입력하고, 결과영상의가로축크기와세로축크기를 m_re_width, m_re_height 에값을지정하면 OnDraw 함수에서는처리된결과를화면오른쪽에표시하게됨 39
업샘플링 (Up Sampling) Section 05 MFC 를이용한영상확대 영상을확대할때는먼저일정한배열간격으로재배열해야하는것 단순업샘플링을사용하여영상을확대하면영상의품질이현저히떨어짐. 영상을확대해도선명한품질을얻고싶다면업샘플링으로얻은데이터와원본영상의데이터를이용하여보간 (Interpolation) 을해야함 3 장에서는단순재배열로확대하는것만다루고보간을사용한영상의확대는 8 장의기하학처리에서학습함. 40
[ 실습하기 3-5] 영상확대프로그램 1 Visual C++ 프로그램을실행한뒤 Workspace 창에서 [ResourceView] 탭클릭 [Menu]-[IDR_IMAGEPTYPE] 폴더더블클릭 [ 영상처리 ] 하위에 [UpSample] 메뉴가새로추가됨. 추가된메뉴에서 [Properties] 클릭 [Menu Item Properties] 대화상자에서다음과같이설정 41
[ 실습하기 3-5] 영상확대프로그램 [View]-[ClassWizard] 메뉴클릭 [MFC ClassWizard] 대화상자에서업샘플링함수를다음과같이생성함. 42
[ 실습하기 3-5] 영상확대프로그램 2 [Add Function] 버튼클릭 View Class 에다운샘플링을담당하는함수를생성 업샘플링도다운샘플링처럼다양한샘플링비율로샘플링이가능하며, 보간법의사용유무와종류를결정해주어야함. 따라서업샘플은새로운대화상자를추가하여업샘플의추가정보를대화상자에서입력받도록함 43
[ 실습하기 3-5] 영상확대프로그램 3 [View]-[ClassWizard] 메뉴를클릭 [MFC ClassWizard] 대화상자에서업샘플링함수를다음과같이생성 44
[ 실습하기 3-5] 영상확대프로그램 4 [MFC ClassWizard] 대화상자에서추가된대화상자를새로운이름의클래스로등록함 CUpSampleDlg 의 IDC_EDIT1 에다음과같이변수등록 45
5 UpSampleDlg 대화상자를 Doc 클래스에서사용하기위해 ImageProcessingDoc.cpp 파일의윗부분에 UpSampleDlg.h 코드를포함시킴 #include "stdafx.h" #include "ImageProcessing.h" #include "ImageProcessingDoc.h" #include "DownSampleDlg.h" #include "UpSampleDlg.h" [ 실습하기 3-5] 영상확대프로그램 Doc 클래스에 OnUpSampling 함수를추가함 46
[ 실습하기 3-5] 영상확대프로그램 void CImageProcessingDoc::OnUpSampling() { int i, j; CUpSampleDlg dlg; if(dlg.domodal() == IDOK){ // DoModal 대화상자의활성화여부 m_re_height = m_height * dlg.m_upsamplerate; // 확대영상의세로길이계산 m_re_width = m_width * dlg.m_upsamplerate; // 확대영상의가로길이계산 m_re_size = m_re_height * m_re_width; // 확대영상의크기계산 m_outputimage = new unsigned char[m_re_size]; // 확대영상을위한메모리할당 for(i=0 ; i<m_re_size ; i++) m_outputimage[i] = 0; // 초기화 for(i=0 ; i<m_height ; i++){ for(j=0 ; j<m_width ; j++){ m_outputimage[i*dlg.m_upsamplerate*m_re_width + dlg.m_upsamplerate*j]= m_inputimage[i*m_width + j]; // 재배치하여영상확대 47
6 View 클래스의 OnUpSampling 함수를다음과같이작성 7 결과영상 [ 실습하기 3-5] 영상확대프로그램 void CImageProcessingView::OnUpSampling() { // TODO: Add your command handler code here CImageProcessingDoc* pdoc = GetDocument(); // Doc 클래스참조 ASSERT_VALID(pDoc); pdoc->onupsampling(); // Doc 클래스에 OnUpSampling 함수호출 Invalidate(TRUE); // 화면갱신 48
양자화 Section 06 MFC 를이용한양자화영상처리 표본화된화소의밝기나색상을정해진몇단계의값으로근사화하는과정 화소의밝기나색상이숫자로표현되어화소는양자화된표본값을갖게됨. 밝기나색상이몇단계로표현되느냐는양자화비트 (Quantization Bits) 로결정됨. 49
[ 실습하기 3-6] 양자화프로그램 1 Visual C++ 프로그램의 Workspace 창에서 [ResourceView] 탭클릭 [Menu]-[IDR_IMAGEPTYPE] 메뉴더블클릭 추가된메뉴프레임의속성을다음과같이지정 50
[ 실습하기 3-6] 양자화프로그램 2 [MFC ClassWizard] 대화상자를이용해 View 클래스에 OnQuantization 함수생성 51
[ 실습하기 3-6] 양자화프로그램 3 ResourceView 창에서 [ImageProcessing resources]-[dialog] 폴더클릭 바로가기메뉴 [Insert Dialog] 클릭 대화상자의속성을다음과같이지정 52
[ 실습하기 3-6] 양자화프로그램 4 [MFC ClassWizard] 대화상자에서양자화비트대화상자의새로운클래스를등록 CQuantizationDlg 클래스를선택하고 [Member Variables] 탭에서 IDC_EDIT1 에다음과같이변수할당 53
[ 실습하기 3-6] 양자화프로그램 Doc 클래스에서양자화비트대화상자를사용하기위해양자화비트대화상자의헤더파일선언 양자화함수를생성하고양자화프로그램작성. 양자화레벨의수는 2bit 로계산되므로, NM 을계산하는 pow 함수를사용함 (math.h 에포함되어있음 ) #include "stdafx.h" #include "ImageProcessing.h" #include "ImageProcessingDoc.h" #include "DownSampleDlg.h" #include "UpSampleDlg.h" #include "QuantizationDlg.h" // 대화상자사용을위한헤더선언 #include "math.h" // 수학함수사용을위한헤더선언 54
void CImageProcessingDoc::OnQuantization() { CQuantizationDlg dlg; if(dlg.domodal() == IDOK) // 양자화비트수를결정하는대화상자의활성화여부 { int i, j, value, LEVEL; double HIGH, *TEMP; m_re_height = m_height; m_re_width = m_width; m_re_size = m_re_height * m_re_width; m_outputimage = new unsigned char[m_re_size]; // 양자화처리된영상을출력하기위한메모리할당 TEMP = new double [m_size]; // 입력영상크기 (m_size) 와동일한메모리할당 LEVEL=256; // 입력영상의양자화단계 (28=256) HIGH=256.; value = (int)pow(2, dlg.m_quantbit); // 양자화단계결정 ( 예 : 24=16) [ 실습하기 3-6] 양자화프로그램 for(i=0 ; i<m_size ; i++){ for(j=0 ; j<value ; j++){ if(m_inputimage[i] >=(LEVEL/value)*j && m_inputimage[i]<(level/value)*(j+1)){ TEMP[i]=(double)(HIGH/value)*j; // 양자화수행 for(i=0 ; i<m_size ; i++){ m_outputimage[i] = (unsigned char)temp[i]; // 결과영상생성 55
[ 실습하기 3-6] 양자화프로그램 6 View 클래스에서 Doc 클래스의 OnQuantization 함수를호출하고화면을갱신할수있도록프로그램작성 void CImageProcessingView::OnQuantization() { // TODO: Add your command handler code here CImageProcessingDoc* pdoc = GetDocument(); // Doc 클래스참조 ASSERT_VALID(pDoc); pdoc->onquantization(); // Doc 클래스에 OnQuantization 함수호출 Invalidate(TRUE); // 화면갱신 7 결과영상 56
Thank you