PowerPoint 프레젠테이션

Similar documents
<B9CCB5F0BEEE20C1A4BAB8C3B3B8AE2E687770>

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

BMP 파일 처리

歯Lecture2.PDF

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

PowerPoint 프레젠테이션

윈도우시스템프로그래밍

윈도우시스템프로그래밍

PowerPoint 프레젠테이션

슬라이드 1

슬라이드 1

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

Microsoft PowerPoint - chap06-2pointer.ppt

PowerPoint 프레젠테이션

chap 5: Trees

히스토그램구하기 사전준비 : 히스토그램을저장할메모리가필요함 필요한메모리개수 à 전체영상의픽셀은그값이 0 ~ 255이므로 256 개의메모리필요함 영상을구성하는픽셀의개수는매우크므로메모리형식은 unsigned long으로해야함 ( unsigned 란 +/- 를고려하지않는다는

Dialog Box 실행파일을 Web에 포함시키는 방법

윈도우시스템프로그래밍

PowerPoint 프레젠테이션

PowerPoint Template

쉽게 풀어쓴 C 프로그래밍

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

Microsoft PowerPoint - chap06-1Array.ppt

[ 그림 8-1] XML 을이용한옵션메뉴설정방법 <menu> <item 항목ID" android:title=" 항목제목 "/> </menu> public boolean oncreateoptionsmenu(menu menu) { getme

Microsoft PowerPoint - Java7.pptx

그래픽 프로그래밍

이미지 워핑과 모핑

<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

윈도우 프로그래밍의 개념

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

슬라이드 1

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

쉽게 풀어쓴 C 프로그래밍

PowerPoint Presentation

유니티 변수-함수.key

윈도우시스템프로그래밍

슬라이드 1

tiawPlot ac 사용방법

12 강. 문자출력 Direct3D 에서는문자를출력하기위해서 LPD3DXFONT 객체를사용한다 LPD3DXFONT 객체생성과초기화 LPD3DXFONT 객체를생성하고초기화하는함수로 D3DXCreateFont() 가있다. HRESULT D3DXCreateFont

iii. Design Tab 을 Click 하여 WindowBuilder 가자동으로생성한 GUI 프로그래밍환경을확인한다.

<4D F736F F F696E74202D20C1A C0E520B5B5C5A5B8D5C6AE20C6C4C0CF20C0D4C3E2B7C220B9D720B4D9BEE7C7D120BAE420C5ACB7A1BDBA2E BC8A3C8AF20B8F0B5E55D>

8 장데이터베이스 8.1 기본개념 - 데이터베이스 : 데이터를조직적으로구조화한집합 (cf. 엑셀파일 ) - 테이블 : 데이터의기록형식 (cf. 엑셀시트의첫줄 ) - 필드 : 같은종류의데이터 (cf. 엑셀시트의각칸 ) - 레코드 : 데이터내용 (cf. 엑셀시트의한줄 )

윤성우의 열혈 TCP/IP 소켓 프로그래밍

슬라이드 1

Lab 3. 실습문제 (Single linked list)_해답.hwp

C 언어 프로그래밊 과제 풀이

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070>

(Microsoft PowerPoint - 07\300\345.ppt [\310\243\310\257 \270\360\265\345])

슬라이드 1

OCW_C언어 기초

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

Microsoft PowerPoint - C++ 5 .pptx

설계란 무엇인가?

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

API - Notification 메크로를통하여어느특정상황이되었을때 SolidWorks 및보낸경로를통하여알림메시지를보낼수있습니다. 이번기술자료에서는메크로에서이벤트처리기를통하여진행할예정이며, 메크로에서작업을수행하는데유용할것입니다. 알림이벤트핸들러는응용프로그램구현하는데있어

<4D F736F F F696E74202D20C1A63034B0AD202D20C7C1B7B9C0D3B8AEBDBAB3CABFCD20B9ABB9F6C6DBC0D4B7C2>

PowerPoint Presentation

Microsoft Word - src.doc

MVVM 패턴의 이해

PowerPoint Presentation

03_queue

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

adfasdfasfdasfasfadf

Microsoft PowerPoint - additional01.ppt [호환 모드]

PowerPoint 프레젠테이션

PowerPoint Presentation

<4D F736F F F696E74202D203039C0E520B4EBC8ADBBF3C0DA205BC8A3C8AF20B8F0B5E55D>

소프트웨어공학 Tutorial #2: StarUML Eun Man Choi

C. KHU-EE xmega Board 에서는 Button 을 2 개만사용하기때문에 GPIO_PUSH_BUTTON_2 과 GPIO_PUSH_BUTTON_3 define 을 Comment 처리 한다. D. AT45DBX 도사용하지않기때문에 Comment 처리한다. E.

슬라이드 1

슬라이드 1

Microsoft PowerPoint - hci2-lecture7.ppt

Microsoft PowerPoint - [2009] 02.pptx

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

경우 1) 80GB( 원본 ) => 2TB( 복사본 ), 원본 80GB 는 MBR 로디스크초기화하고 NTFS 로포맷한경우 복사본 HDD 도 MBR 로디스크초기화되고 80GB 만큼포맷되고나머지영역 (80GB~ 나머지부분 ) 은할당되지않음 으로나온다. A. Window P

<4D F736F F F696E74202D2034C5D8BDBAC6AEC6C4C0CFC0D4C3E2B7C2312E505054>

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

var answer = confirm(" 확인이나취소를누르세요."); // 확인창은사용자의의사를묻는데사용합니다. if(answer == true){ document.write(" 확인을눌렀습니다."); else { document.write(" 취소를눌렀습니다.");

금오공대 컴퓨터공학전공 강의자료

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

Microsoft PowerPoint - ch07 - 포인터 pm0415

슬라이드 1

슬라이드 1

Endpoint Protector - Active Directory Deployment Guide

쉽게 풀어쓴 C 프로그래밍

Windows 8에서 BioStar 1 설치하기

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

윈도우즈프로그래밍(1)

학습목표 함수프로시저, 서브프로시저의의미를안다. 매개변수전달방식을학습한다. 함수를이용한프로그래밍한다. 2

Microsoft PowerPoint - e pptx

목차 윈도우드라이버 1. 매뉴얼안내 운영체제 (OS) 환경 윈도우드라이버준비 윈도우드라이버설치 Windows XP/Server 2003 에서설치 Serial 또는 Parallel 포트의경우.

PowerPoint 프레젠테이션

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc

설계란 무엇인가?

PowerPoint 프레젠테이션

C++ Programming

Transcription:

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