03장 영상처리를 위한 Visual C++ 디지털 영상 파일 포맷 MFC 응용 프로그램 마법사를 이용한 MFC 프로젝트 작성

Slides:



Advertisements
Similar presentations
멘토링 2 주차 장 프로그래밍을 위한 자바의 자료형  값이 변하지 않는 상수  메모리 기억공간인 변수.
Advertisements

YES C 제 1 장 C 언어의 개요 1/34 제 1 장 C 언어의 개요 문봉근. YES C 제 1 장 C 언어의 개요 2/34 제 1 장 C 언어의 개요 1.1 프로그램과 C 언어의 특징 1.2 C 언어의 프로그램 구성 1.3 비주얼 C++ 통합 환경 들어가기.
프로젝트 보고서 학과 : 임학과 학번 : 성명 : 조성환 Windows 프로그래밍.
Visual C++ Programming Document/View Architecture
컴퓨터 공학 설계 및 실험 I MFC programming
명품 JAVA Programming 제 3 장 반복문, 배열, 예외처리.
Vision System Lab, Sang-Hun Han
03장 영상처리를 위한 Visual C++ 디지털 영상 파일 포맷
명품 C++ 프로그래밍 3장. 클래스와 객체.
컴퓨터 응용 및 실습 Part1. OOP&Java Programming data type Review
C++ Espresso 제3장 배열과 포인터.
C++ Espresso 제1장 기초 사항.
Lecture 2 MFC and Application Frameworks
Visual C++ Programming Dialog Box
Lab 10 Guide: 프린터 출력 예제. 한 페이지의 그림 인쇄 (교재 24장, 쪽)
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
제 1 장 영상처리 기초.
D. 지뢰찾기 분석 설계 예제.
다이얼로그 박스와 컨트롤 컴퓨터 계측 및 실습.
2014 ITA 8월 강의 C Programming -1주차- C언어 기초 정대진 ( )
컬러 LED바 이해하기 목차 재료준비 및 브레드 보드 배선 구성하기 컬러 LED바 이해 및 프로그램 실습 응용 작품 만들기.
Lab 3 Guide: 교재 4장 대화상자 예제. - 프로파일 입력 ( 쪽)
1. C 언어의 이해와 컴파일러 설치.
실전 프로젝트 2 : 숫자야구 숫자 야구를 구현해보자.
시스템 생명 주기(System Life Cycle)(1/2)
윤 홍 란 MFC 기초 윤 홍 란
명품 C++ 13장 예외 처리와 C 언어와의 링크 지정.
8. 객체와 클래스 (기본).
제3장 추가 실습 3장 관련 C 언어 프로그래밍 실습.
Kasimov C언어 세미나 1st.
시스템 생명 주기(System Life Cycle)(1/2)
컴퓨터의 기초 제 4강 - 표준 입출력, 함수의 기초 2006년 4월 10일.
1 C 언어의 이해와 컴파일러 설치 프로그래밍 환경을 구축하자!.
연산자 대입 연산자 산술 연산자 관계 연산자 논리 연산자 비트 연산자 콤마 연산자 축약 연산자 sizeof 연산자
Chapter 1 디지털 영상처리의 개념.
Network Socket Programming
6장 히스토그램 처리 차 례 히스토그램의 개요 히스토그램의 용도 영상 이치화 히스토그램 평활화 히스토그램 스트레칭
MFC Application Frameworks (AFX)
Visual C++ Programming Output and File
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
Chapter 05. 클래스 완성. chapter 05. 클래스 완성 01. 복사 생성자 복사 생성(Copy Construction) 생성될 때 자신과 같은 타입의 객체를 변수로 받아, 이 객체와 같은 값을 갖는 새로운 객체를 생성하는 것 명시적인 생성 과정뿐만.
영상처리 시작하기 & 영상처리 프로그램 만들기
03장 영상처리를 위한 Visual C++ 디지털 영상 파일 포맷
프로그래밍2 및 실습 C언어 기반의 C++ 2.
분할 윈도, 다중 뷰… 영상 통신 연구실 권 동 진 발표 일 : 04월 27일.
제 3 장 영역 기반 처리.
4주차: Data Types and Functions
헤더 파싱 ( Header Parsing ).
C언어 프로그래밍의 이해 Ch13. 선행처리기와 주석문.
DataScience Lab. 박사과정 김희찬 (월)
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
03. 안드로이드를 위한 Java 문법 제목. 03. 안드로이드를 위한 Java 문법 제목.
제 2장 어휘구조와 자료형 토 큰 리 터 럴 주 석 자 료 형 배 열 형.
쉽게 풀어쓴 C언어 Express 제15장 전처리 및 비트연산 C Express Slide 1 (of 29)
[CPA340] Algorithms and Practice Youn-Hee Han
Chapter 04 자료 유형.
ODBC &DAO 안명상.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
처음으로 배우는 C 프로그래밍 제3부 함수 제 6 장 함수 작성.
Lab 9 Guide: 인터넷 프로그래밍 예제 * 일대일 채팅 프로그램 (교재 27장, 쪽)
제 11장. 템플릿과 STL 학기 프로그래밍언어및실습 (C++).
자바 5.0 프로그래밍.
제 7장 이벤트.
04장 ㅎㅎ 화소점 처리 화소 점 처리의 개념 디지털 영상의 산술연산과 논리연산 디지털 영상의 다양한 화소 점 처리 기법
04장 ㅎㅎ 화소점 처리 화소 점 처리의 개념 디지털 영상의 산술연산과 논리연산 디지털 영상의 다양한 화소 점 처리 기법
컨트롤, 프로퍼티, 이벤트.
경희대학교 학위논문제출 교육 테크노경영대학원 2008년 11월 25일.
C++ 언어의 특징
Ch.11. 이진영상처리를 이용한 영상인식.
제 4장 Visual C++ COM 컴파일러.
Presentation transcript:

03장 영상처리를 위한 Visual C++ 디지털 영상 파일 포맷 MFC 응용 프로그램 마법사를 이용한 MFC 프로젝트 작성

참고교재 학습목표 샘플프로그램 다운로드 3장. 영상처리를 위한 Visual C++ 디지털 영상처리 입문, 신종홍, 장선봉, 지인호 저, 한빛미디어, 2008년 학습목표 영상처리에 사용되는 RAW 파일 포맷을 이해한다. MFC 응용 프로그램 마법사를 이용한 영상처리 프로그램 기법을 익힌다. MFC의 기본 구조를 이해한다. 샘플프로그램 다운로드 http://www.hanb.co.kr/web/example/1533/

영상 파일 포맷의 종류: BMP, JPEG, RAW, GIF, PSD, TIFF 등 BMP, JPEG 파일 포맷 Section 01 디지털 영상 파일 포맷 영상 파일 포맷의 종류: BMP, JPEG, RAW, GIF, PSD, TIFF 등 BMP, JPEG 파일 포맷 영상의 색상 정보, 해상도 등을 알 수 있는 정보가 헤더(Header)에 포함되어 있음 → 추가 작업이 필요해 프로그램이 더 복잡해짐. RAW 파일 포맷 헤더 정보 없이 완전한 데이터만으로 구성 → 복잡한 헤더 정보를 해석할 필요가 없어 영상처리가 복잡하지 않음. 헤더 정보가 없어 영상의 색상 정보나 해상도 정보를 사용자가 미리 알아야 하는 단점이 있음.

Raw와 BMP 파일 구조

[실습하기 3-1] MFC 응용 프로그램 마법사를 이용한 MFC프로젝트 작성 [시작] 버튼 클릭 → [프로그램]-[Microsoft Visual Studio 2012]-[Visual Studio 2012] 메뉴 클릭 → Visual C++ 시작 화면에서 [파일]-[새로만들기]-[프로젝트]메뉴 클릭 [새 프로젝트] 대화상자에서 MFC 응용프로그램 항목 클릭 → 이름 란에 작성할 프로그램 이름 입력, 위치 항목에 프로그램을 저장할 위치 지정

[실습하기 3-1] MFC 응용 프로그램 마법사를 이용한 MFC프로젝트 작성 준 선택 → 지원하는 언어 선택 → 유니코드 라이브러리 사용 해제

[실습하기 3-1] MFC 응용 프로그램 마법사를 이용한 MFC프로젝트 작성 [MFC 응용 프로그램 마법사] 대화상자의 복합 문서 지원 단계에서 OLE 기능의 사용 여부를 ‘없음’으로 선택 [MFC 응용 프로그램 마법사] 대화상자의 문서 템플릿 속성 단계에서 불러올 영상 파일의 확장자를 디지털 영상처리에서 기본 파일 포맷인 raw로 지정

[실습하기 3-1] MFC 응용 프로그램 마법사를 이용한 MFC프로젝트 작성

[실습하기 3-1] MFC 응용 프로그램 마법사를 이용한 MFC프로젝트 작성

[실습하기 3-1] MFC 응용 프로그램 마법사를 이용한 MFC프로젝트 작성 새 창이 실행되고 솔루션 탐색기, 클래스 뷰, 속성 관리자 영역이 활성화됨. 여기에서 리소스 뷰 탭이 활성화 돼 있지 않으면 솔루션 탐색기 탭의 목록 중 ImageProcessing → 리소스 파일 → ImageProcessing.rc항목을 선택해 리소스 뷰 탭을 활성화 시킴.

[실습하기 3-1] MFC 응용 프로그램 마법사를 이용한 MFC프로젝트 작성 ⑫ Workspace의 솔루션 탐색기, 클래스 뷰, 리소스 뷰 탭이 모두 활성화 되고 Edit, Debug영역이 모두 활성화된 상태. 여기에서 프로그램 작성을 시작하면 됨. ➊ ➋ ➍ ➎ ➏ ➌

[실습하기 3-1] MFC 응용 프로그램 마법사를 이용한 MFC프로젝트 작성 ➊ Workspace : 윈도우 탐색기와 같은 역할. 클래스, 대화상자, 파일 확인 가능 ➋ Edit : 프로그램을 작성하는 부분 ➌ Debug : 오류 발생시 경고 및 오류 정보를 표시 ➍~ ➏ Workspace : 솔루션 탐색기, 클래스 뷰, 리소스 뷰 영역으로 다시 나뉨 ➍ 솔루션 탐색기 ➎ 클래스 뷰 ➏ 리소스 뷰

OnOpenDocument 함수를 이용한 파일 입력 디지털 영상을 처리하려면 디지털 영상을 처리하려면 디지털 영상을 Visual C++로 입력받은 뒤 일정한 루틴 따라 처리한 후 그 결과를 다시 디지털 영상 파일로 저장하는 과정이 필요. RAW 포맷의 디지털 영상에는 0~255로 구성된 8비트 그레이 레벨이 있어 C 언어의 unsigned char(0~255, 8비트)로 저장 가능 디지털 영상처리의 입력이나 출력 값은 모두 정수형이지만, 다양한 처리과정에서 실수 값이 나올 수도 있음. 이 때는 입력 영상의 데이터 값을 실수형(double)로 전환하여 영상을 처리해야 데이터가 손실되지 않음. OnOpenDocument 함수를 이용한 파일 입력 영상 데이터를 파일에서 읽어 오려면 OnOpenDocument 함수를 재정의해야 함. OnOpenDocument 함수는 [파일]-[열기] 메뉴를 클릭하면 파일을 입력받을 수 있는 대화상자를 실행시키는 역할 수행

[실습하기 3-1] OnOpenDocument 함수를 이용한 파일 입력 프로그램 Visual C++ 프로그램에서 [프로젝트]-[클래스 마법사] 메뉴를 클릭 → [클래스 마법사] 대화상자에서 가상 함수 탭 클릭 → 가상 함수 탭에서 다음과 같이 지정 → [함수 추가] 버튼 클릭 → CImageProcessingDoc 클래스에 함수에 추가됨.

[실습하기 3-1] OnOpenDocument 함수를 이용한 파일 입력 프로그램 재정의된 가상 함수 항목에 OnOpenDocument 함수가 추가됐는지 확인 → [코드 편집] 버튼 클릭 → OnOpenDocument 함수로 이동

[실습하기 3-1] OnOpenDocument 함수를 이용한 파일 입력 프로그램 ※ 간혹 #5054와 불필요한 return 구문이 추가 되면 지우도록 하자. BOOL CImageProcessingDoc::OnOpenDocument(LPCTSTR lpszPathName) { if (!CDocument::OnOpenDocument(lpszPathName)) return FALSE; // TODO: 여기에 특수화된 작성 코드를 추가합니다. return TRUE; }

[실습하기 3-1] OnOpenDocument 함수를 이용한 파일 입력 프로그램 영상을 입력받으려면 변수를 추가해야 함. 영상 데이터를 저장하는 변수, 영상의 가로축과 세로축 크기 변수를 지정해야 함. CImageProcessingDoc에 변수를 추가하기 위해 클래스 뷰 Workspace 창으로 이동

[실습하기 3-1] OnOpenDocument 함수를 이용한 파일 입력 프로그램 BOOL CImageProcessingDoc::OnOpenDocument(LPCTSTR lpszPathName) { if (!CDocument::OnOpenDocument(lpszPathName)) return FALSE; CFile File; // 파일 객체선언 File.Open(lpszPathName, CFile::modeRead | CFile::typeBinary); // 파일 열기 다이얼로그 박스에서 선택한 파일을 지정하고 읽기 모드 선택 if(File.GetLength() == 32*32){ // RAW 파일의 크기 결정 m_height = 32; m_width = 32; } else if(File.GetLength() == 64*64){ // RAW 파일의 크기 결정 m_height = 64; m_width = 64; else if(File.GetLength() == 128*128){ // RAW 파일의 크기 결정 m_height = 128; m_width = 128; else 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;

[실습하기 3-1] OnOpenDocument 함수를 이용한 파일 입력 프로그램 else if(File.GetLength() == 640*480){ // RAW 파일의 크기 결정 m_height = 480; m_width = 640; } else if(File.GetLength() == 176*144){// RAW 파일의 크기 결정 m_height = 144; m_width = 176; else if(File.GetLength() == 176*216){ // RAW 파일의 크기 결정 m_height = 216; else{ AfxMessageBox("Not Support Image Size"); //32*32, 64*64, 128*128, 256*256, 512*512, 640*480, 176*144 크기의 파일만을 지원 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;

[실습하기 3-1] OnOpenDocument 함수를 이용한 파일 입력 프로그램 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)); } 간혹 /*pDC*/로 작성되는 경우가 있음

[실습하기 3-1] OnOpenDocument 함수를 이용한 파일 입력 프로그램 결과 영상

Section 03 MFC를 이용한 영상처리 입출력 프로그램 작성 OnSaveDocument 함수를 이용한 파일 출력 Visual C++에서 처리된 영상 데이터는 1차원이나 2차원 형태의 배열 데이터로 존재함. 이 배열 데이터를 확장자가 raw인 파일로 출력하려면 프로그램이 필요한데, 이것을 지원하는 함수가 바로 OnSaveDocument

[실습하기 3-3] OnSaveDocument 함수를 이용한 파일 출력 프로그램 Visual C++ 프로그램에서 [프로젝트]-[클래스 마법사] 메뉴 클릭 → [클래스 마법사] 대화상자에서 다음과 같이 지정 → [함수 추가] 버튼 클릭하여 OnSaveDocument 클래스를 함수에 추가

[실습하기 1-1] OnSaveDocument 함수를 이용한 파일 출력 프로그램 Member functions 항목에 OnSaveDocument가 추가된 것 확인 → [코드 편집] 버튼을 클릭해 OnSaveDocument 함수 이동 OnSaveDocument 함수가 다음과 같은 형태로 추가됨. 여기에 프로그램을 추가하여 영상 데이터를 파일로 출력함. BOOL CImageProcessingDoc::OnSaveDocument(LPCTSTR lpszPathName) { // TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다. return CDocument::OnSaveDocument(lpszPathName); }

[실습하기 3-3] OnSaveDocument 함수를 이용한 파일 출력 프로그램 [저장] 버튼을 클릭 → [다른 이름으로 저장] 대화상자에서 저장할 파일 이름을 입력해 프로그램 저장 BOOL CImageProcessingDoc::OnSaveDocument(LPCTSTR lpszPathName) { CFile File; CFileDialog SaveDlg(FALSE, "raw", NULL, OFN_HIDEREADONLY); if(SaveDlg.DoModal() == IDOK){ // DoModal 함수를 통하여 저장하기를 수행 File.Open(SaveDlg.GetPathName(), CFile::modeCreate | CFile::modeWrite); File.Write(m_OutputImage, m_Re_size); // 파일 쓰기 File.Close(); // 파일 닫기 } return CDocument::OnSaveDocument(lpszPathName);

Section 04 MFC를 이용한 영상 축소 다운 샘플링(Down Sampling) 디지털 영상을 축소하는 가장 간단한 방법 다운 샘플링은 원 영상의 값을 일정한 좌표 단위로 버리는 것. 디지털 영상은 2차원이므로 수평축 샘플링과 수직축 샘플링이 모두 되어야 함.

[실습하기 3-4] 영상 축소 프로그램 Visual C++ 프로그램의 Workspace 창에서 [리소스 뷰] 탭 클릭 → [Menu]-[IDR_ImageProcessingTYPE] 메뉴를 더블클릭해 [도움말] 메뉴 오른쪽에 프레임 메뉴를 하나 만듦 → 프레임 메뉴 클릭 → ‘영상처리’ 입력 → [Enter] 클릭

[실습하기 3-4] 영상 축소 프로그램 → [영상처리] 메뉴 아래에 상자 선택 → ‘Downsample’ 입력 → 생성된 [DownSample] 메뉴에서 바로가기 메뉴 → [ID 편집] 클릭 → ‘ID_DOWN_SAMPLING’ 입력 ➊ ➋

[실습하기 3-4] 영상 축소 프로그램 → [클래스 마법사] 대화상자에서 개체 ID 항목을 ID_DOWN_SAMPLING, 메시지 항목을 COMMAND로 선택 → <처리기 추가> 버튼 클릭

[실습하기 3-4] 영상 축소 프로그램 [멤버 함수 추가] 대화상자의 View Class에서 다운 샘플링을 담당할 함수가 생성됐는지 확인 → [확인] 버튼 클릭 → 다시 [클래스 마법사] 대화상자에서 [코드 편집] 버튼을 클릭해 함수로 이동 리소스 뷰 창에서 [ImageProcessing]-[Dialog] 폴더 선택 → 바로가기 메뉴 [Dialog 삽입] 클릭 → 새 [Dialog] 대화상자가 추가됨.

[실습하기 3-4] 영상 축소 프로그램 화면 우측의 도구 상자를 이용하여 대화상자에 샘플링 비율을 입력할 수 있도록 대화상자 편집

[실습하기 3-4] 영상 축소 프로그램 → 대화상자에 삽입된 각 항목의 속성(Properties)을 다음과 같이 설정 ※ Caption은 해당 대화상자(또는 항목)를 누르고 바로 입력하면 된다.

[실습하기 3-4] 영상 축소 프로그램 대화상자 더블클릭 → [MFC 클래스 추가 마법사] 대화상자에서 새로 추가된 대화상자를 추가하기 항목 입력 → [MFC 클래스 추가 마법사] 대화상자에서 다음과 같이 지정한 뒤 [OK] 버튼 클릭(클래스 이름 앞에는 반드시 ‘C’를 붙여주어야 함)→ 클래스의 이름을 등록하면 파일 이름은 자동으로 생성됨.

[실습하기 3-4] 영상 축소 프로그램 [프로젝트]-[클래스 마법사] 메뉴 클릭 → [클래스 마법사] 대화상자의 클래스 이름 항목에서 CDownSampleDlg 클래스를 선택한 뒤 [멤버 변수] 탭 클릭 → 다음과 같이 세부 항목을 지정한 뒤 [변수 추가] 버튼 클릭 → [멤버 변수 추가 마법사] 대화상자에서 다음과 같이 지정하고 [마침] 버튼 클릭 다음 장에도 계속 →

[실습하기 3-4] 영상 축소 프로그램 컨트롤 ID 변수 이름 범주 변수 형식 최소값 최대값 IDC_EDIT1 m_DownSampleRate Value int 1 32

[실습하기 3-4] 영상 축소 프로그램 메인 프레임에서 [영상처리]-[DownSample] 메뉴를 클릭했을 때 실제로 다운 샘플링이 발생하도록 프로그램을 작성해 주어야 함. 파일을 입·출력 때처럼 Doc 클래스에서 실제로 프로그램을 작성하고, View 클래스가 작성된 프로그램을 호출하여 화면에 출력할 수 있도록 만듦 추가된 대화상자를 Doc 클래스에서 사용하려면 다음과 같은 선언 부분이 필요함. ImageProcessingDoc.cpp 파일의 윗부분에 DownSampleDlg.h 코드 추가 #include "stdafx.h" #ifndef SHARED_HANDLERS #include "ImageProcessing.h" #endif #include "ImageProcessingDoc.h" #include <propkey.h> #include "DownSampleDlg.h" // 대화상자를 위한 헤더 선언

[실습하기 3-4] 영상 축소 프로그램 Doc 클래스에 OnDownSampling 함수 추가 → 클래스 뷰 Workspace에서 CimageProcessingDoc 항목에서 바로가기 메뉴 [추가] → [변수 추가]를 클릭 → 처리 결과 저장 변수, 결과 영상의 가로축 크기, 세로축 크기 지정 변수 등의 사용할 변수 추가 반환 형식 void 함수 이름 OnDownSampling 액세스 Public

→ 다음과 같이 OnDownSampling 함수 작성 [실습하기 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]; // 축소 영상을 생성 }

[실습하기 3-4] 영상 축소 프로그램 ⑩ 다음과 같이 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); // 화면 갱신 }

[실습하기 3-4] 영상 축소 프로그램 ⑪ 처리된 결과를 화면에 표시하기 위해 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]; pDC->SetPixel(j+pDoc->m_width+10, i+5, RGB(R, G, B));

[실습하기 3-4] 영상 축소 프로그램 ⑫ 실행 결과 영상. 이후 작성되는 프로그램에서는 결과 영상을 m_OutputImage 배열에 입력하고, 결과 영상의 가로축 크기와 세로축 크기를 m_Re_width, m_Re_height에 값을 지정하면 OnDraw 함수에서는 처리된 결과를 화면 오른쪽에 표시하게 됨

Section 05 MFC를 이용한 영상 확대 업 샘플링(Up Sampling) 영상을 확대할 때는 먼저 일정한 배열 간격으로 재배열해야 하는 것 단순 업 샘플링을 사용하여 영상을 확대하면 영상의 품질이 현저히 떨어짐. 영상을 확대해도 선명한 품질을 얻고 싶다면 업 샘플링으로 얻은 데이터와 원본 영상의 데이터를 이용하여 보간(Interpolation)을 해야 함 3장에서는 단순 재배열로 확대하는 것만 다루고 보간을 사용한 영상의 확대는 8장의 기하학 처리에서 학습함.

[실습하기 3-5] 영상 확대 프로그램 Visual C++ 프로그램을 실행한 뒤 Workspace 창에서 [리소스 뷰] 탭 클릭 → [Menu]-[IDR_ImageProcessingPTYPE] 폴더 더블클릭 → [영상처리] 하위에 [UpSample] 메뉴 새로 추가 →추가된 메뉴의 바로가기 메뉴에서 [ID 편집] 클릭 → ‘ID_UP_SAMPLING’ 입력 ➊ ➋

[실습하기 3-5] 영상 확대 프로그램 → [프로젝트]-[클래스 마법사] 메뉴 클릭 → [클래스 마법사] 대화상자에서 업 샘플링 함수를 다음과 같이 생성함.

[실습하기 3-5] 영상 확대 프로그램 [처리기 추가] 버튼 클릭 → 뷰 클래스에 다운 샘플링을 담당하는 함수를 생성 → 업 샘플링도 다운 샘플링처럼 다양한 샘플링 비율로 샘플링이 가능하며, 보간법의 사용 유무와 종류를 결정해 주어야 함. 따라서 업 샘플은 새로운 대화상자를 추가하여 업 샘플의 추가 정보를 대화상자에서 입력받도록 함

[실습하기 3-5] 영상 확대 프로그램 [리소스 뷰]-[Dialog] 의 바로가기 메뉴 → [Dialog 삽입] → 대화상자를 다음과 같이 작성

→ CUpSampleDlg의 IDC_EDIT1에 다음과 같이 변수 등록 [실습하기 3-5] 영상 확대 프로그램 대화상자를 더블 클릭하여 추가된 대화상자를 새로운 이름의 클래스로 등록함 → CUpSampleDlg의 IDC_EDIT1에 다음과 같이 변수 등록

[실습하기 3-5] 영상 확대 프로그램 UpSampleDlg 대화상자를 Doc 클래스에서 사용하기 위해 ImageProcessingDoc.cpp 파일의 윗부분에 UpSampleDlg.h 코드를 포함시킴 → Doc 클래스에 OnUpSampling 함수를 추가함 #include "stdafx.h" #include "ImageProcessing.h" #include "ImageProcessingDoc.h" #include "DownSampleDlg.h" #include "UpSampleDlg.h"

[실습하기 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]; } // 재배치하여 영상 확대 }

[실습하기 3-5] 영상 확대 프로그램 View 클래스의 OnUpSampling 함수를 다음과 같이 작성 결과 영상 void CImageProcessingView::OnUpSampling() { // TODO: Add your command handler code here CImageProcessingDoc* pDoc = GetDocument(); // Doc 클래스 참조 ASSERT_VALID(pDoc); pDoc->OnUpSampling(); // Doc 클래스에 OnUpSampling 함수 호출 Invalidate(TRUE); // 화면 갱신 }

Section 06 MFC를 이용한 양자화 영상처리 표본화된 화소의 밝기나 색상을 정해진 몇 단계의 값으로 근사화하는 과정 화소의 밝기나 색상이 숫자로 표현되어 화소는 양자화된 표본 값을 갖게 됨. 밝기나 색상이 몇 단계로 표현되느냐는 양자화 비트(Quantization Bits)로 결정됨.

[실습하기 3-6] 양자화 프로그램 Visual C++ 프로그램의 Workspace 창에서 [리소스 뷰] 탭 클릭 → [Menu]-[IDR_ImageProcessingTYPE] 메뉴 더블클릭 → Caption을 ‘양자화’, ID를 ‘ ID_QUANTIZATION’으로 입력 ➊ ➋

[실습하기 3-6] 양자화 프로그램 [클래스 마법사] 대화상자를 이용해 View 클래스에 OnQuantization 함수 생성

[실습하기 3-6] 양자화 프로그램 리소스 뷰 창에서 [Dialog] 폴더 클릭→ 바로가기 메뉴 [Dialog 삽입] 클릭→ 대화상자의 속성을 다음과 같이 지정

[실습하기 3-6] 양자화 프로그램 [MFC 클래스 추가 마법사] 대화상자에서 양자화 비트 대화상자의 새로운 클래스를 등록 → CQuantizationDlg 클래스를 선택하고 [멤버 변수] 탭에서 IDC_EDIT1에 다음과 같이 변수 할당

[실습하기 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 <cmath> // 수학 함수 사용을 위한 헤더 선언

[실습하기 3-6] 양자화 프로그램 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) 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; // 양자화 수행 } m_OutputImage[i] = (unsigned char)TEMP[i]; // 결과 영상 생성 Visual 2012에서는 오버로드된 함수 “pow”의 인스턴스 중 두 개 이상이 인수 목록과 일치한다고 오류가 뜰 것이다. 이 경우 pow함수의 변수 2앞에 (double)이나 (float)같은 정의를 붙여주면 해결 될 것이다.

[실습하기 3-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); // 화면 갱신 }