04장 ㅎㅎ 화소점 처리 화소 점 처리의 개념 디지털 영상의 산술연산과 논리연산 디지털 영상의 다양한 화소 점 처리 기법

Slides:



Advertisements
Similar presentations
YOUR LOGO HERE - 청솔 초등학교 부설 영재학급 분당초 4 학년 5 반 이소은 -
Advertisements

Ch04 시장으로의 이향 : 전략과 절차 중국경제의 이해. LOGO Contents 시장경제로의 전환에 대한 중국의 접근방법 1 개혁은 어떻게 시작되었나 ? 2 경제개혁의 2 단계 접근법 년까지 시장으로의 이행을 구성한 요소들 4 天安門 간주기 5 개혁의.
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++ 통합 환경 들어가기.
Computer Graphics 1 윈도우 프로그래밍 실습 II 김 창 헌김 창 헌.
메시지 처리의 기본 개념 메시지 발생된 이벤트의 종류와 정보를 전달하는 일종의 상수 값 윈도우 프로그래밍 가장 중요한 것은 메시지를 처리하는 것 윈도우 시스템 Application 이벤트 발생 메시지 전송 메시지 처리 화면에 출력.
프로젝트 보고서 학과 : 임학과 학번 : 성명 : 조성환 Windows 프로그래밍.
컴퓨터 공학 설계 및 실험 I MFC programming
아름다운 이들의 행복한 길음안나의 집.
Vision System Lab, Sang-Hun Han
제 3 장 변수와 자료형.
03장 영상처리를 위한 Visual C++ 디지털 영상 파일 포맷 MFC 응용 프로그램 마법사를 이용한 MFC 프로젝트 작성
03장 영상처리를 위한 Visual C++ 디지털 영상 파일 포맷
Multimedia Programming 04: Point Processing Departments of Digital Contents Sang Il Park.
Multimedia Programming 05: Point Processing
Visual C++ Programming Document/View Architecture 3
제 1 장 영상처리 기초.
D. 지뢰찾기 분석 설계 예제.
다이얼로그 박스와 컨트롤 컴퓨터 계측 및 실습.
Chapter 02 JAVA 프로그래밍 시작하기 01 실무에서 사용하는 JAVA 개발 환경 02 JAVA 프로그램 작성
컬러 LED바 이해하기 목차 재료준비 및 브레드 보드 배선 구성하기 컬러 LED바 이해 및 프로그램 실습 응용 작품 만들기.
Lab 3 Guide: 교재 4장 대화상자 예제. - 프로파일 입력 ( 쪽)
제3장 추가 실습 3장 관련 C 언어 프로그래밍 실습.
쉽게 풀어쓴 C언어 Express 제8장 함수 C Express Slide 1 (of 26)
Power Java 제4장 자바 프로그래밍 기초.
07장 영역 처리를 이용한 에지 검출 ㅎㅎ 에지 검출의 개요 에지 검출기 1차 미분을 이용한 에지 검출
컴퓨터의 기초 제 4강 - 표준 입출력, 함수의 기초 2006년 4월 10일.
쉽게 풀어쓴 C언어 Express 제9장 함수와 변수 C Express.
06장 ㅎㅎ 화소 영역 처리 화소 영역 처리의 개념 회선 처리의 원리 블러링 샤프닝 한빛미디어(주)
연산자 대입 연산자 산술 연산자 관계 연산자 논리 연산자 비트 연산자 콤마 연산자 축약 연산자 sizeof 연산자
Chapter 1 디지털 영상처리의 개념.
Network Socket Programming
Microsoft Visual C++ 제 1편 입문편 5장. 샘플 프로그램의 사용자화
6장 히스토그램 처리 차 례 히스토그램의 개요 히스토그램의 용도 영상 이치화 히스토그램 평활화 히스토그램 스트레칭
MFC Application Frameworks (AFX)
4분기 업무보고 및 2011계획 방 문 건 강 관 리.
Visual C++ Programming Common Controls
조도 센서 김한수.
AVR - Chapter 2 황 지 연.
C++ 개요 객체지향 윈도우즈 프로그래밍 한국성서대학교 유일선
03장 영상처리를 위한 Visual C++ 디지털 영상 파일 포맷
4장. 컴퓨터 구조에 대한 두 번째 이야기 작성자: 윤성우.
프로그래밍2 및 실습 C언어 기반의 C++ 2.
2 데이터 표현과 컴퓨터 연산 IT CookBook, 컴퓨터 구조와 원리 2.0.
분할 윈도, 다중 뷰… 영상 통신 연구실 권 동 진 발표 일 : 04월 27일.
제주닷컴 매뉴얼 (실시간 예약시스템) 2013년 10월.
제 3 장 영역 기반 처리.
사회복지 법제론 /노인장기요양보험법 문은홍 조소라.
나이스 진로정보 초‧중‧고 연계 서비스 안내 (수) 한국교육학술정보원 교육행정부 김지광 선임연구원
제 6장 함수 Hello!! C 언어 강성호 김학배 최우영.
제 3 장 연산자 (Operators).
컴퓨터 프로그래밍 기초 - 4th : 수식과 연산자 -
함수와 변수 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
ODBC &DAO 안명상.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
비주얼 프로그래밍 1분반 화/목.
Lab 9 Guide: 인터넷 프로그래밍 예제 * 일대일 채팅 프로그램 (교재 27장, 쪽)
자바 5.0 프로그래밍.
학과:컴퓨터시뮬레이션과 담당교수:명연수 교수님 학번: 이름:백지영
제목을 입력해 주세요 ┗ SUB TITLE을 입력해 주세요 홍길동.
JA V A W. 07 Sb.L.
사업계획서.
Drawing graphs.
제 7장 이벤트.
04장 ㅎㅎ 화소점 처리 화소 점 처리의 개념 디지털 영상의 산술연산과 논리연산 디지털 영상의 다양한 화소 점 처리 기법
6월 1주 주간메뉴표 NEW 엄마손 조식 쉐프 삼촌 중식 참새 방앗간 석식 ◎원산지 안내 : 쌀(국내산)
제안 제도 운영방안.
컨트롤, 프로퍼티, 이벤트.
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
Ch.11. 이진영상처리를 이용한 영상인식.
제 4장 Visual C++ COM 컴파일러.
Presentation transcript:

04장 ㅎㅎ 화소점 처리 화소 점 처리의 개념 디지털 영상의 산술연산과 논리연산 디지털 영상의 다양한 화소 점 처리 기법 한빛미디어(주)

학습목표 4장. 화소 점 처리 화소 점 처리의 개념을 알아본다. 디지털 영상의 화소에서 산술연산과 그 효과를 알아본다. 디지털 영상에서 논리연산과 그 효과를 알아본다. 다양한 영상의 화소 점 처리 기법을 익힌다.

Section 01 화소 점 처리의 개념 화소 점 처리 원 화소의 값이나 위치를 바탕으로 단일 화소 값을 변경하는 기술 다른 화소의 영향을 받지 않고 단순히 화소 점의 값만 변경하므로 포인트 처리(Point Processing)라고도 함. 산술연산, 논리연산, 반전, 광도 보정, 히스토그램 평활화, 명암 대비 스트레칭 등의 기법이 있음. 디지털 영상의 산술연산은 디지털 영상의 각 화소 값에서 임의의 상수 값으로 덧셈, 뺄셈, 곱셈, 나눗셈을 수행하는 것 그레이 레벨 영상에서 화소 값이 작으면 영상이 어둡고, 화소의 값이 크면 밝음.

산술연산과 논리연산 산술연산 밝기 조정과 관련된 작업 수행 논리연산 참과 거짓을 판별하는 연산 화소의 상수 값에서 AND, OR, XOR, NOT 등의 연산을 수행하여 디지털 영상에서 차폐, 특징 추출, 형태 분석을 함.

히스토그램(Histogram) 히스토그램(Histogram) 기둥그래프나 기둥 모양 그림이라고도 하며, 관측한 데이터가 분포된 특징을 한눈에 볼 수 있도록 기둥 모양으로 나타낸 것. 가로축에는 레벨(Level)을, 세로축에는 각 레벨의 빈도수를 표시함. 즉, 가로축은 영상의 밝기(Intensity) 값, 세로축은 가로축의 밝기 값에 대응하는 디지털 영상 내의 화소 수

히스토그램 평활화와 명세화 히스토그램 평활화 기술 편중된 디지털 영상의 히스토그램을 골고루 분산시켜 영상 전체의 명암 대비를 높여줌. 히스토그램 명세화 기술 디지털 영상이 원하는 히스토그램을 갖게 해주는 기술. 특정 부분의 명암 대비를 높일 수 있음.

Section 02 디지털 영상의 산술연산과 논리연산 화소의 밝기 값 밝기의 단계 수는 화소를 표현하는 양자화 비트 수가 결정 그레이 레벨 영상에서는 색은 없고 밝기만 있음. 보통, 화소는 밝기를 나타내는데, 주로 양자화 비트 수를 8비트로 표현 명암 대비 대비(Contrast): 영상 내에 있는 가장 밝은 값과 가장 어두운 값의 차이로, 영상의 품질을 결정하는 중요한 요소임. 높은 대비를 보이는 디지털 영상: 어두운 명도와 밝은 명도의 차이가 너무 커서 시각적으로 좀더 명확하게 보임. 낮은 대비를 보이는 디지털 영상: 밝기의 차이가 크지 않아 시각적으로 명확하지 못함.

디지털 영상의 산술연산 화소 값의 덧셈연산 화소의 밝기 값에 특정한 상수 값을 더해 화소의 밝기 값을 증가시켜 영상을 밝게 하는 처리 기술 화소의 값에 임의의 상수를 더할 때 화소의 최대값을 넘기도 함. 최대값인 255를 넘는 값은 모두 255로 처리

디지털 영상의 산술연산(계속)

디지털 영상의 산술연산(계속) 화소 값의 뺄셈연산 화소의 밝기 값에 특정한 상수 값을 빼 화소의 밝기 값을 감소시켜 영상의 밝기를 어둡게 하는 처리 기술 화소의 값에 임의의 상수를 뺄 때 화소의 최소값 0보다도 작은 음수가 발생할 수 있음. 화소의 최소값인 0보다 작은 음수 값은 모두 0으로 처리

디지털 영상의 산술연산(계속) 화소 값의 곱셈연산 화소 값의 나눗셈연산 화소의 밝기 값에 특정 상수 값을 곱해 전체적으로 화소의 밝기 값이 증가해 더 밝아짐. 밝은 부분은 더욱 밝아지고, 어두운 부분은 약간 밝아져 영상 내의 밝기에 커다란 차이가 생기는 것 밝기의 차이가 커지므로 영상의 선명도 증가함. 화소 값의 나눗셈연산 화소 값을 임의의 상수 값으로 나누면 전체적으로 화소의 밝기 값은 감소하고, 최대 밝기와 최소 밝기의 차이는 작아짐. 밝은 부분은 많이 어두워지고, 어두운 부분은 약간 어두워짐.

디지털 영상의 산술연산(계속)

디지털 영상의 산술연산(계속)

산술연산의 문제점과 해결 방법 문제점 해결 방법 결과 값이 화소의 최대값과 최소값을 넘을 수 있음. 클래핑(Clamping) 기법 연산의 결과 값이 최소값보다 작으면 그 결과 값을 최소값으로, 최대값보다 크면 결과 값을 최대값으로 하는 기법 8비트 그레이 영상의 최소값은 0, 최대값은 255 음수는 0으로 설정하고, 255보다 큰 값은 255로 설정함. 랩핑(Wraping) 기법 연산의 결과 값이 최소값보다 작으면 그 결과 값을 최소값으로, 최대값보다 크면 최소값부터 최대값까지를 한 주기로 해서 이를 반복하는 기법 최대값+1은 최소값이 되고, 연산의 결과 값이 최대값+상수 값일 때는 계속 상수 값-1로 설정함. 8비트 그레이 영상의 최소값은 당연히 0이고, 최대값은 255 음수는 0으로, 255보다 큰 결과 값 256은 0으로, 257은 1로 설정한 후 이런 방식으로 주기를 계속 반복

산술연산의 문제점과 해결 방법(계속)

[실습하기 4-1] 상수 값 입력 대화상자 ① 대화상자 편집하는 법, 이 후에 속성에서 값을 입력하면 됨.

[실습하기 4-1] 상수 값 입력 대화상자 [MENU]에서 추가 할 때.

[실습하기 4-1] 상수 값 입력 대화상자 Visual C++ 프로그램의 Workspace 창에서 [리소스 뷰] 탭을 클릭 → [ImageProcessing resources]-[Dialog] 폴더 클릭→ 폴더 우 클릭 후 [Dialog 삽입]을 클릭해 대화상자 추가 →우측 끝에 도구 상자에서 edit Control과 static Text로 추가 → 속성에서 Cpation 입력.

[실습하기 4-1] 상수 값 입력 대화상자 대화상자 더블클릭 → [MFC 클래스 추가 마법사] 대화상자에서 새로 추가된 대화상자를 추가하기 항목 입력 생성된 edit box에 변수 할당: [클래스 마법사]의 대화상자의 클래스 이름 항목에서 CConstantDlg Class을 선택한 뒤 [맴버 변수] 탭 → 컨트롤 ID 항목에서 ID_EDIT1을 선택하고 [변수 추가] 버튼을 클릭 → [멤버 변수 추가 마법사] 대화상자에서 다음과 같이 실수형 변수를 선언 → [마침] 버튼 클릭 * 변수형식 double 은 최소, 최대값을 입력이 안되지만, 안 써도 문제가 없음. 컨트롤 ID 변수 이름 범주 변수 형식 최소값 최대값 IDC_EDIT1 m_Constant Value double 255

[실습하기 4-1] 상수 값 입력 대화상자 Doc 클래스에서 사용하기 위해 ConstantDlg.h 선언 #include "ImageProcessingDoc.h" #include "DownSampleDlg.h" #include "UpSampleDlg.h" #include "QuantizationDlg.h" #include "math.h" #include "ConstantDlg.h" // 상수 입력 대화상자 사용을 위한 헤더 선언

[실습하기 4-2] 상수 값 상수 덧셈 프로그램 리소스 뷰 창에서 [Menu]-[IDR_IMAGETYPE] 더블클릭 → 메뉴 추가 [클래스 마법사] 대화상자를 이용해 추가된 메뉴에서 화소 값의 덧셈을 실행하는 함수 추가 →개체 ID에서 ID_SUM_CONSTANT를 찾은 후에 메시지에 있는 common을 누른 후에 처리기 추가누르기.

[실습하기 4-2] 상수 값 상수 덧셈 프로그램 ③ Doc 클래스의 OnSumConstant 함수에 미리 작성한 [상수 입력] 대화상자를 호출하여 상수 값을 입력받아 화소 값의 덧셈연산을 수행하는 프로그램 작성

[실습하기 4-2] 상수 값 상수 덧셈 프로그램 void CImageProcessingDoc::OnSumConstant() { CConstantDlg dlg; // 상수 값을 입력받는 대화상자 int i; 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]; if(dlg.DoModal() == IDOK){ for(i=0 ; i<m_size ; i++){ if(m_InputImage[i] + dlg.m_Constant >= 255) m_OutputImage[i] = 255; // 출력 값이 255보다 크면 255 출력 else m_OutputImage[i]=(unsigned char)(m_InputImage[i] + dlg.m_Constant); // 상수 값과 화소 값과의 덧셈 }

[실습하기 4-2] 상수 값 상수 덧셈 프로그램 View 클래스의 OnSumConstant 함수에 Doc 클래스의 OnSumConstant 함수를 호출하여 화면에 출력하는 프로그램 작성 void CImageProcessingView::OnSumConstant() { // TODO: Add your command handler code here CImageProcessingDoc* pDoc = GetDocument(); // 도큐먼트 클래스 참조 ASSERT_VALID(pDoc); // 인스턴스 주소를 가져옴 pDoc->OnSumConstant(); Invalidate(TRUE); }

[실습하기 4-2] 상수 값 상수 덧셈 프로그램 프로그램 실행 결과 영상 상수 덧셈 프로그램 구현 결과[원본 영상(왼쪽), 결과 영상+30(오른쪽)]

[실습하기 4-3] 화소 값의 상수 뺄셈 프로그램 리소스 뷰 창에서 [Menu]-[IDR_IMAGETYPE] 더블클릭 → 메뉴 추가 [클래스 마법사] 대화상자를 이용해 추가된 메뉴에서 화소 값의 덧셈을 실행하는 함수 추가 Doc 클래스의 OnSubConstant 함수에 미리 작성한 [상수 입력] 대화상자를 호출하여 상수 값을 입력받아 화소 값의 뺄셈연산을 수행하는 프로그램 작성

[실습하기 4-3] 화소 값의 상수 뺄셈 프로그램 void CImageProcessingDoc::OnSubConstant() { CConstantDlg dlg; int i; 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]; if(dlg.DoModal() == IDOK){ for(i=0 ; i<m_size ; i++){ if(m_InputImage[i] - dlg.m_Constant < 0) m_OutputImage[i] = 0; // 출력 값이 255보다 크면 255를 출력 else m_OutputImage [i] = (unsigned char)(m_InputImage[i] - dlg.m_Constant); // 상수 값과 화소 값과의 뺄셈 }

[실습하기 4-3] 화소 값의 상수 뺄셈 프로그램 View 클래스의 OnSubConstant 함수에 Doc 클래스의 OnSubnstant 함수를 호출하여 화면에 출력하는 프로그램 void CImageProcessingView::OnSubConstant() { // TODO: Add your command handler code here CImageProcessingDoc* pDoc = GetDocument();// 도큐먼트 클래스 참조 ASSERT_VALID(pDoc); // 인스턴스 주소를 가져옴 pDoc->OnSubConstant(); Invalidate(TRUE); }

[실습하기 4-3] 화소 값의 상수 뺄셈 프로그램 프로그램을 실행 결과 영상 상수 뺄셈 프로그램 구현 결과[원본 영상(왼쪽), 결과 영상 -50(오른쪽)]

[실습하기 4-4] 화소 값의 상수 곱셈 프로그램 리소스 뷰 창에서 [Menu]-[IDR_IMAGETYPE] 더블클릭 → 메뉴 추가 [클래스 마법사] 대화상자에서 추가된 메뉴에서 화소 값의 곱셈을 실행하는 함수 추가 Doc 클래스의 OnMulConstant 함수에 미리 작성한 [상수 입력] 대화상자를 호출하여 상수 값을 입력받아 화소 값의 곱셈연산을 수행하는 프로그램 작성

[실습하기 4-4] 화소 값의 상수 곱셈 프로그램 void CImageProcessingDoc::OnMulConstant() { CConstantDlg dlg; int i; 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]; if(dlg.DoModal() == IDOK){ for(i=0 ; i<m_size ; i++){ if(m_InputImage[i] * dlg.m_Constant > 255) m_OutputImage[i] = 255; // 곱의 값이 255보다 크면 255를 출력 else if(m_InputImage[i] * dlg.m_Constant < 0) m_OutputImage[i] = 0; // 곱의 값이 0보다 작으면 0을 출력 else m_OutputImage [i] = (unsigned char)(m_InputImage[i] * dlg.m_ Constant); // 상수 값과 화소 값 곱셈 }

[실습하기 4-4] 화소 값의 상수 곱셈 프로그램 View 클래스의 OnMulConstant 함수에 Doc 클래스의 OnMulConstant 함수를 호출하여 화면에 출력하는 프로그램 작성 void CImageProcessingView::OnMulConstant() { // TODO: Add your command handler code here CImageProcessingDoc* pDoc = GetDocument(); // 도큐먼트 클래스 참조 ASSERT_VALID(pDoc); // 인스턴스 주소를 가져옴 pDoc->OnMulConstant(); Invalidate(TRUE); }

[실습하기 4-4] 화소 값의 상수 곱셈 프로그램 프로그램을 실행 결과 영상 상수 곱셈 프로그램 구현 결과[원본 영상(왼쪽), 결과 영상X2(오른쪽)]

[실습하기 4-5] 화소 값의 상수 나눗셈 프로그램 리소스 뷰 창에서 [Menu]-[IDR_IMAGETYPE] 더블클릭 → 메뉴 추가 [클래스 마법사] 대화상자에서 추가된 메뉴에서 화소 값의 나눗셈을 실행하는 함수 추가 Doc 클래스의 OnDivConstant 함수에 미리 작성한 [상수 입력] 대화상자를 호출하여 상수 값을 입력받아 화소 값의 나눗셈연산을 수행하는 프로그램

[실습하기 4-5] 화소 값의 상수 나눗셈 프로그램 void CImageProcessingDoc::OnDivConstant() { CConstantDlg dlg; int i; 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]; if(dlg.DoModal() == IDOK){ for(i=0 ; i<m_size ; i++){ if(m_InputImage[i] / dlg.m_Constant > 255) m_OutputImage[i] = 255; // 나눗셈의 값이 255보다 크면 255를 출력 else if(m_InputImage[i] / dlg.m_Constant < 0) m_OutputImage[i] = 0; // 나눗셈의 값이 0보다 작으면 0을 출력 else m_OutputImage [i] = (unsigned char)(m_InputImage[i] / dlg.m_Constant); // 상수 값과 화소 값 나눗셈 }

[실습하기 4-5] 화소 값의 상수 나눗셈 프로그램 View 클래스의 OnDivConstant 함수에 Doc 클래스의 OnDivConstant 함수를 호출하여 화면에 출력하는 프로그램 작성 void CImageProcessingView::OnDivConstant() { // TODO: Add your command handler code here CImageProcessingDoc* pDoc = GetDocument(); // 도큐먼트 클래스 참조 ASSERT_VALID(pDoc); // 인스턴스 주소를 가져옴 pDoc->OnDivConstant(); Invalidate(TRUE); }

[실습하기 4-5] 화소 값의 상수 나눗셈 프로그램 프로그램 실행 결과 영상 상수 나눗셈 프로그램 구현 결과[원본 영상(왼쪽), 결과 영상 /2(오른쪽)]

디지털 영상의 논리연산 화소 값의 AND 연산 원하는 비트를 선택적으로 0으로 만드는 기능이 있어 마스크(mask) 연산이라고도 함 영상의 특정 화소 비트에서 0으로 구성된 이진 데이터와 AND 연산을 수행

디지털 영상의 논리연산(계속) 화소 값의 OR 연산 특정 비트를 선택적으로 1로 구성할 수 있어 선택적-세트(selective-set)연산이라고도 함 화소의 특정 비트를 1로 만들려고 원하는 비트 위치가 1로 구성된 이진 데이터와 OR 연산을 수행

화소 값의 XOR 연산 디지털 영상의 논리연산(계속) 입력이 서로 다를 때만 1을 출력하는 연산으로, 두 데이터를 비교하므로 비교(compare)연산이라고도 함 같은 비트에서만 0을 출력함

디지털 영상의 논리연산(계속) 화소 값의 NOT 연산 화소 비트를 반전시키는 일을 함. 영상에서는 검정색이 흰색으로, 흰색이 검정색으로 반전됨

[실습하기 4-6] 화소 값의 AND 프로그램 리소스 뷰 창에서 [Menu]-[IDR_IMAGETYPE] 더블클릭 → 메뉴 추가 [클래스 마법사] 대화상자를 이용해 Doc 클래스와 View 클래스에 함수 추가

[실습하기 4-6] 화소 값의 AND 프로그램 Doc 클래스의 OnAndOperate 함수에 다음 프로그램 추가 void CImageProcessingDoc::OnAndOperate() { CConstantDlg dlg; int i; 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]; if(dlg.DoModal() == IDOK){ for(i=0 ; i<m_size ; i++){ // 비트 단위 AND 연산 if((m_InputImage[i] & (unsigned char)dlg.m_Constant)>= 255) {m_OutputImage[i] = 255; } else if((m_InputImage[i] & (unsigned char)dlg.m_Constant)< 0) {m_OutputImage[i] = 0; else{ m_OutputImage [i] = (m_InputImage[i] & (unsigned char)dlg.m_Constant);

[실습하기 4-6] 화소 값의 AND 프로그램 View 클래스의 OnAndOperate 함수에 다음 프로그램 추가 void CImageProcessingView::OnAndOperate() { // TODO: Add your command handler code here CImageProcessingDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pDoc->OnAndOperate(); Invalidate(TRUE); }

영상의 화소 값에 상수 128을 AND 연산한 결과 영상 프로그램 실행 결과 영상 영상의 화소 값에 상수 128을 AND 연산한 결과 영상

[실습하기 4-7] 화소 값의 OR 프로그램 리소스 뷰 창에서 [Menu]-[IDR_IMAGETYPE] 더블클릭 → 메뉴 추가 [클래스 마법사] 대화상자를 이용해 Doc 클래스와 View 클래스에 함수 추가 Doc 클래스의 OnOrOperate 함수에 다음 프로그램 추가

[실습하기 4-7] 화소 값의 OR 프로그램 void CImageProcessingDoc::OnOrOperate() { CConstantDlg dlg; int i; 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]; if(dlg.DoModal() == IDOK){ for(i=0 ; i<m_size ; i++){ // 비트 단위 OR 연산 if((m_InputImage[i] | (unsigned char)dlg.m_ Constant) >= 255){ m_OutputImage[i] = 255; } else if((m_InputImage[i] |(unsigned char)dlg.m_ Constant) < 0){ m_OutputImage[i] = 0; else{ m_OutputImage [i] = (m_InputImage[i] | unsigned char)dlg.m_Constant);

[실습하기 4-7] 화소 값의 OR 프로그램 View 클래스의 OnOrOperate 함수에 다음 프로그램 추가 void CImageProcessingView::OnOrOperate() { // TODO: Add your command handler code here CImageProcessingDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pDoc->OnOrOperate(); Invalidate(TRUE); }

[실습하기 4-7] 화소 값의 OR 프로그램 프로그램 실행 결과 영상 영상의 화소 값에 상수 128을 OR 연산한 결과 영상

[실습하기 4-8] 화소 값의 XOR 프로그램 리소스 뷰 창에서 [Menu]-[IDR_IMAGETYPE] 더블클릭 → 메뉴 추가 [클래스 마법사] 대화상자를 이용해 Doc 클래스와 View 클래스에 함수 추가 Doc 클래스의 OnXorOperate 함수에 다음 프로그램 추가

[실습하기 4-8] 화소 값의 XOR 프로그램 void CImageProcessingDoc::OnXorOperate() { CConstantDlg dlg; int i; 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]; if(dlg.DoModal() == IDOK){ for(i=0 ; i<m_size ; i++){ // 비트 단위 XOR 연산 if((m_InputImage[i] ^ (unsigned char)dlg.m_Constant) >= 255){ m_OutputImage[i] = 255; } else if((m_InputImage[i] ^ (unsigned char)dlg.m_ Constant) < 0){ m_OutputImage[i] = 0; else{ m_OutputImage [i] = (m_InputImage[i] ^ (unsigned char)dlg.m_Constant);

[실습하기 4-8] 화소 값의 XOR 프로그램 View 클래스의 OnXorOperate 함수에 다음 프로그램 추가 void CImageProcessingView::OnXorOperate() { // TODO: Add your command handler code here CImageProcessingDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pDoc->OnXorOperate(); Invalidate(TRUE); }

영상의 화소 값에 상수 128을 XOR 연산한 결과 영상 프로그램 실행 결과 영상 영상의 화소 값에 상수 128을 XOR 연산한 결과 영상

Section 03 디지털 영상의 다양한 화소 점 처리 기법 Output(q) = T[Input(p)] p는 입력 영상의 화소 값이고, T로 화소 값을 변환함 q는 값을 변환하여 얻는 출력 화소 값 명암 변환(Intensity Transform) 밝기를 변경하는 것 미리 지정된 변환 함수를 기반으로 입력 영상의 이전 화소를 새로운 화소로 변환하는 점 처리 기법

입력 영상을 출력 영상으로 변환해도 변화가 없는 것 단순히 입력 화소를 출력 화소로 바꾸는 변환 널 변환(Null Transform) 입력 영상을 출력 영상으로 변환해도 변화가 없는 것 단순히 입력 화소를 출력 화소로 바꾸는 변환 널 변환의 변환 함수 Output(q) = Input(p)

영상의 반전 변환(Negative Transform) 사진학적 역변환 각 화소의 값이 영상 내에 대칭이 되는 값으로 변환 8비트 그레이 레벨의 영상을 반전시키면 화소 값 0번은 255번으로, 화소 값 1번은 254번으로 변환됨 반전 변환의 변환 함수 Output(q) = 255 - Input(p)

감마 보정(Gamma Correction) 입력 값을 조정하여 출력을 제대로 만드는 과정 감마 보정 함수 Output(q) = [Input(p)](1/ ) 함수의 감마 값( )에 따라 영상을 밝게 하거나 흐리게 조절할 수 있음 감마 값이 1보다 크면 영상이 어두워지고, 1보다 작으면 영상이 밝아짐

명암 대비 변환(Intensity Contrast Transform) 명암 대비 스트레칭(Intensity Contrast Stretch) 밝기의 차이를 크게 하는 것 영상의 가장 밝은 값을 최대 밝게, 가장 어두운 값을 최대 어둡게 설정하여 높은 명암 대비를 보이는 영상을 생성하는 것 명암 대비 압축(Intensity Contrast Compress) 영상의 가장 어두운 값을 밝게, 가장 밝은 값을 어둡게 하여 밝기 차이를 줄임으로써 낮은 명암 대비를 보이는 영상을 생성하는 것

명암 대비 변환(Intensity Contrast Transform)(계속)

경계 값을 이용한 처리 경계 값을 이용한 처리 디지털 영상의 화소 값을 주어진 경계 값으로 그룹화하여 결국 화소 값의 수를 감소시키는 처리 방법

영상에서 화소에 있는 명암 값의 범위를 경계 값으로 축소 포스터라이징 (Posterizing) 영상에서 화소에 있는 명암 값의 범위를 경계 값으로 축소 경계 값 8개로 8비트 그레이 레벨 영상을 포스터라이징 처리하면, 명암 값 256개가 명암 값 8개로 변경됨.

경계 값을 이용해 값이 두 개만 있는 영상으로 변환해 주는것 보통 그레이 레벨 영상을 이진 영상으로 변환할 때 사용 이진화 (Binarization) 경계 값을 이용해 값이 두 개만 있는 영상으로 변환해 주는것 보통 그레이 레벨 영상을 이진 영상으로 변환할 때 사용 값이 두 개뿐이라서 영상을 쉽게 분석할 수 있고, 명암 대비가 매우 낮은 영상에서는 배경과 물체를 확실하게 구분할 수 있게 해줌.

영상에서 한 부분의 화소는 원 상태를 그대로 유지한 채 일정 범위의 화소만 강조하는 변환 범위 강조 변환 영상에서 한 부분의 화소는 원 상태를 그대로 유지한 채 일정 범위의 화소만 강조하는 변환 원하는 부분의 화소 값이 더 커지거나 작아져 다른 부분과 비교해서 더욱 도드라져 보임.

[실습하기 4-9] 영상을 반전시키는 프로그램 리소스 뷰 창에서 [Menu]-[IDR_IMAGETYPE] 더블클릭 → 메뉴 추가 [클래스 마법사] 대화상자를 이용해 Doc 클래스와 View 클래스에 함수 추가

[실습하기 4-9] 영상을 반전시키는 프로그램 Doc 클래스의 OnNegaTransform 함수에 다음 프로그램 추가 void CImageProcessingDoc::OnNegaTransform() { int i; 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]; for(i=0 ; i<m_size ; i++) m_OutputImage[i] = 255 - m_InputImage[i]; // 영상 반전을 수행 }

[실습하기 4-9] 영상을 반전시키는 프로그램 View 클래스의 OnNegaTransform 함수에 다음 프로그램 추가 void CImageProcessingView::OnNegaTransform() { // TODO: Add your command handler code here CImageProcessingDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pDoc->OnNegaTransform(); Invalidate(TRUE); }

[실습하기 4-9] 영상을 반전시키는 프로그램 프로그램 실행 결과 영상 영상 반전 프로그램을 구현한 결과 영상

감마 보정하는 함수 : Output(q) = [Input(p)](1/Γ) [실습하기 4-10] 감마 보정 프로그램 감마 보정하는 함수 : Output(q) = [Input(p)](1/Γ) Γ값은 영상의 산술연산에서 사용한 [상수 입력] 대화상자를 이용하여 입력받도록 함. 리소스 뷰 창에서 [Menu]-[IDR_IMAGETYPE] 더블클릭 → 메뉴 추가 [클래스 마법사] 대화상자를 이용해 Doc 클래스와 View 클래스에 함수 추가

[실습하기 4-10] 감마 보정 프로그램 Doc 클래스의 OnGammaCorrection 함수에 다음 프로그램 추가 void CImageProcessingDoc::OnGammaCorrection() { CConstantDlg dlg; int i; double 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]; if(dlg.DoModal() == IDOK){ for(i=0 ; i<m_size ; i++){ temp = pow(m_InputImage[i], 1/dlg.m_Constant); // 감마 값 계산 if(temp < 0) m_OutputImage[i] = 0; else if(temp > 255) m_OutputImage[i] = 255; else m_OutputImage[i] = (unsigned char)temp; }

[실습하기 4-10] 감마 보정 프로그램 View 클래스의 OnGammaCorrection 함수에 다음 프로그램 추가 void CImageProcessingView::OnGammaCorrection() { // TODO: Add your command handler code here CImageProcessingDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pDoc->OnGammaCorrection(); Invalidate(TRUE); }

감마 보정 프로그램을 구현한 결과 영상(r = 0.85) [실습하기 4-10] 감마 보정 프로그램 프로그램 실행 결과 영상 감마 보정 프로그램을 구현한 결과 영상(r = 0.85)

영상의 이진화는 임의의 경계 값(Threshold)을 이용 [실습하기 4-11] 영상의 이진 프로그램 영상의 이진화는 임의의 경계 값(Threshold)을 이용 임의의 경계 값은 영상의 산술연산에서 사용한 [상수 입력] 대화상자를 이용해 입력받도록 함 리소스 뷰 창에서 [Menu]-[IDR_IMAGETYPE] 더블클릭 → 메뉴 추가 [클래스 마법사] 대화상자를 이용해 Doc 클래스와 View 클래스에 함수 추가

[실습하기 4-11] 영상의 이진 프로그램 Doc 클래스의 OnBinarization 함수에 다음 프로그램 추가 void CImageProcessingDoc::OnBinarization() { CConstantDlg dlg; int i; 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]; if(dlg.DoModal() == IDOK){ for(i=0 ; i<m_size ; i++){ if(m_InputImage[i] >= dlg.m_Constant) m_OutputImage[i] = 255; // 임계 값보다 크면 255 출력 else m_OutputImage[i] = 0; // 임계 값보다 작으면 0 출력 }

[실습하기 4-11] 영상의 이진 프로그램 View 클래스의 OnBinarization 함수에 다음 프로그램 추가 void CImageProcessingView::OnBinarization() { // TODO: Add your command handler code here CImageProcessingDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pDoc->OnBinarization(); Invalidate(TRUE); }

영상의 이진 프로그램을 실습한 경과 영상(경계 값 = 130) [실습하기 4-11] 영상의 이진 프로그램 프로그램 실행 결과 영상 영상의 이진 프로그램을 실습한 경과 영상(경계 값 = 130)

[실습하기 4-12] 범위를 강조하는 변환 프로그램 화소 값의 범위를 선택하려고 다음과 같이 대화상자를 만듦.

[실습하기 4-12] 범위를 강조하는 변환 프로그램 [프로잭트]-[클래스 마법사] 메뉴 클릭→ [클래스 마법사] 대화상자를 이용해 새로운 클래스 (CStressTransformDlg)등록 → StressTransformDlg.h 선언 #include "stdafx.h" #include "ImageProcessing.h" #include "ImageProcessingDoc.h" #include "DowmSampleDlg.h" #include "UpSampleDlg.h" #include "QuantizationDlg.h" #include "math.h" #include "ConstantDlg.h" #include "StressTransformDlg.h" // 범위 강조 대화상자를 위한 헤더 선언

[실습하기 4-12] 범위를 강조하는 변환 프로그램 생성된 edit box에 변수 할당: [클래스 마법사]의 대화상자의 클래스 이름 항목에서 CConstantDlg Class을 선택한 뒤 [맴버 변수] 탭 → 컨트롤 ID 항목에서 ID_EDIT1과 ID_EDIT2를 각각 선택하고 [변수 추가] 버튼을 클릭 → [멤버 변수 추가 마법사] 대화상자에서 다음과 같이 실수형 변수를 선언 → [마침] 버튼 클릭 [리소스뷰] 창에서 [Menu]-[IDR_IMAGETYPE] 폴더를 더블클릭 하여 메뉴 추가 컨트롤 ID 변수 이름 범주 변수 형식 최소값 최대값 IDC_EDIT1 m_StratPoint Value int 255 m_EndPoint

[실습하기 4-12] 범위를 강조하는 변환 프로그램 [클래스 마법사] 대화상자를 이용해 범위 강조 변환을 수행하는 함수 추가

[실습하기 4-12] 범위를 강조하는 변환 프로그램 Doc 클래스의 OnStressTransform 함수에 다음 프로그램 추가 void CImageProcessingDoc::OnStressTransform() { CStressTransformDlg dlg; int i; 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]; if(dlg.DoModal() == IDOK){ for(i=0 ; i<m_size ; i++){ // 입력 값이 강조 시작 값과 강조 종료 값 사이에 위치하면 255 출력 if(m_InputImage[i] >= dlg.m_StartPoint && m_InputImage[i] <= dlg.m_EndPoint) m_OutputImage[i] = 255; else m_OutputImage[i] = m_InputImage[i]; }

[실습하기 4-12] 범위를 강조하는 변환 프로그램 View 클래스의 OnStressTransform 함수에 다음 프로그램 추가 void CImageProcessingDoc::OnStressTransform() { // TODO: Add your command handler code here CImageProcessingDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pDoc-> OnStressTransform (); Invalidate(TRUE); }

[실습하기 4-12] 범위를 강조하는 변환 프로그램 프로그램 실행 결과 영상 범위 강조하여 변환한 결과 영상(범위 : 100~150)

컬러 영상에는 다양한 색상이 있으므로 화소는 색의 밝기를 표현함 화소 점 처리 원 화소의 값이나 위치를 바탕으로 단일 화소 값이 각각 독립적으로 변경되는 기술 컬러 영상에는 다양한 색상이 있으므로 화소는 색의 밝기를 표현함 RGB 영상에서는 빨간색의 R 채널, 초록색의 G 채널, 파란색의 B 채널 영상이 각 화소를 8비트로 표현함. AND 연산과 OR 연산 특정 비트를 0으로 바꾸려면 특정 비트 위치가 0으로 구성된 이진 데이터와 AND 연산 수행 특정 비트를 1로 구성하려면 특정 비트 위치가 1로 설정된 이진 데이터와 OR 연산 수행 XOR 비교연산. 화소 비트와 임의의 이진 비트를 XOR해서 대응되는 비트의 값이 같으면 화소의 해당 비트를 0으로 구성 NOT 연산 화소 비트를 반전시킴(검정색은 흰색으로, 흰색은 검정색으로)

명암 대비 스트레칭 포스터라이징 이진화 범위 강조 변환 높은 명암 대비를 보이는 영상을, 명암 대비 압축은 낮은 명암 대비를 보이는 영상을 생성하는 것 포스터라이징 영상에서 화소에 있는 명암 값의 범위를 경계 값으로 축소하는 기법 이진화 영상의 화소 값을 경계 값을 이용해 값이 두 개만 있는 영상으로 변환해 주는 것 범위 강조 변환 영상에서 한 부분의 화소는 원 상태를 그대로 유지한 채 일정 범위의 화소만 강조하는 변환