Download presentation
Presentation is loading. Please wait.
Published bySusanti Hermawan Modified 5년 전
1
04장 ㅎㅎ 화소점 처리 화소 점 처리의 개념 디지털 영상의 산술연산과 논리연산 디지털 영상의 다양한 화소 점 처리 기법
한빛미디어(주)
2
학습목표 4장. 화소 점 처리 화소 점 처리의 개념을 알아본다. 디지털 영상의 화소에서 산술연산과 그 효과를 알아본다.
디지털 영상에서 논리연산과 그 효과를 알아본다. 다양한 영상의 화소 점 처리 기법을 익힌다.
3
Section 01 화소 점 처리의 개념 화소 점 처리 원 화소의 값이나 위치를 바탕으로 단일 화소 값을 변경하는 기술
다른 화소의 영향을 받지 않고 단순히 화소 점의 값만 변경하므로 포인트 처리(Point Processing)라고도 함. 산술연산, 논리연산, 반전, 광도 보정, 히스토그램 평활화, 명암 대비 스트레칭 등의 기법이 있음. 디지털 영상의 산술연산은 디지털 영상의 각 화소 값에서 임의의 상수 값으로 덧셈, 뺄셈, 곱셈, 나눗셈을 수행하는 것 그레이 레벨 영상에서 화소 값이 작으면 영상이 어둡고, 화소의 값이 크면 밝음.
4
산술연산과 논리연산 산술연산 밝기 조정과 관련된 작업 수행 논리연산 참과 거짓을 판별하는 연산
화소의 상수 값에서 AND, OR, XOR, NOT 등의 연산을 수행하여 디지털 영상에서 차폐, 특징 추출, 형태 분석을 함.
5
히스토그램(Histogram) 히스토그램(Histogram)
기둥그래프나 기둥 모양 그림이라고도 하며, 관측한 데이터가 분포된 특징을 한눈에 볼 수 있도록 기둥 모양으로 나타낸 것. 가로축에는 레벨(Level)을, 세로축에는 각 레벨의 빈도수를 표시함. 즉, 가로축은 영상의 밝기(Intensity) 값, 세로축은 가로축의 밝기 값에 대응하는 디지털 영상 내의 화소 수
6
히스토그램 평활화와 명세화 히스토그램 평활화 기술
편중된 디지털 영상의 히스토그램을 골고루 분산시켜 영상 전체의 명암 대비를 높여줌. 히스토그램 명세화 기술 디지털 영상이 원하는 히스토그램을 갖게 해주는 기술. 특정 부분의 명암 대비를 높일 수 있음.
7
Section 02 디지털 영상의 산술연산과 논리연산
화소의 밝기 값 밝기의 단계 수는 화소를 표현하는 양자화 비트 수가 결정 그레이 레벨 영상에서는 색은 없고 밝기만 있음. 보통, 화소는 밝기를 나타내는데, 주로 양자화 비트 수를 8비트로 표현 명암 대비 대비(Contrast): 영상 내에 있는 가장 밝은 값과 가장 어두운 값의 차이로, 영상의 품질을 결정하는 중요한 요소임. 높은 대비를 보이는 디지털 영상: 어두운 명도와 밝은 명도의 차이가 너무 커서 시각적으로 좀더 명확하게 보임. 낮은 대비를 보이는 디지털 영상: 밝기의 차이가 크지 않아 시각적으로 명확하지 못함.
8
디지털 영상의 산술연산 화소 값의 덧셈연산 화소의 밝기 값에 특정한 상수 값을 더해 화소의 밝기 값을 증가시켜 영상을 밝게 하는 처리 기술 화소의 값에 임의의 상수를 더할 때 화소의 최대값을 넘기도 함. 최대값인 255를 넘는 값은 모두 255로 처리
9
디지털 영상의 산술연산(계속)
10
디지털 영상의 산술연산(계속) 화소 값의 뺄셈연산
화소의 밝기 값에 특정한 상수 값을 빼 화소의 밝기 값을 감소시켜 영상의 밝기를 어둡게 하는 처리 기술 화소의 값에 임의의 상수를 뺄 때 화소의 최소값 0보다도 작은 음수가 발생할 수 있음. 화소의 최소값인 0보다 작은 음수 값은 모두 0으로 처리
11
디지털 영상의 산술연산(계속) 화소 값의 곱셈연산 화소 값의 나눗셈연산
화소의 밝기 값에 특정 상수 값을 곱해 전체적으로 화소의 밝기 값이 증가해 더 밝아짐. 밝은 부분은 더욱 밝아지고, 어두운 부분은 약간 밝아져 영상 내의 밝기에 커다란 차이가 생기는 것 밝기의 차이가 커지므로 영상의 선명도 증가함. 화소 값의 나눗셈연산 화소 값을 임의의 상수 값으로 나누면 전체적으로 화소의 밝기 값은 감소하고, 최대 밝기와 최소 밝기의 차이는 작아짐. 밝은 부분은 많이 어두워지고, 어두운 부분은 약간 어두워짐.
12
디지털 영상의 산술연산(계속)
13
디지털 영상의 산술연산(계속)
14
산술연산의 문제점과 해결 방법 문제점 해결 방법 결과 값이 화소의 최대값과 최소값을 넘을 수 있음.
클래핑(Clamping) 기법 연산의 결과 값이 최소값보다 작으면 그 결과 값을 최소값으로, 최대값보다 크면 결과 값을 최대값으로 하는 기법 8비트 그레이 영상의 최소값은 0, 최대값은 255 음수는 0으로 설정하고, 255보다 큰 값은 255로 설정함. 랩핑(Wraping) 기법 연산의 결과 값이 최소값보다 작으면 그 결과 값을 최소값으로, 최대값보다 크면 최소값부터 최대값까지를 한 주기로 해서 이를 반복하는 기법 최대값+1은 최소값이 되고, 연산의 결과 값이 최대값+상수 값일 때는 계속 상수 값-1로 설정함. 8비트 그레이 영상의 최소값은 당연히 0이고, 최대값은 255 음수는 0으로, 255보다 큰 결과 값 256은 0으로, 257은 1로 설정한 후 이런 방식으로 주기를 계속 반복
15
산술연산의 문제점과 해결 방법(계속)
16
[실습하기 4-1] 상수 값 입력 대화상자 ① 대화상자 편집하는 법, 이 후에 속성에서 값을 입력하면 됨.
17
[실습하기 4-1] 상수 값 입력 대화상자 [MENU]에서 추가 할 때.
18
[실습하기 4-1] 상수 값 입력 대화상자 Visual C++ 프로그램의 Workspace 창에서 [리소스 뷰] 탭을 클릭 → [ImageProcessing resources]-[Dialog] 폴더 클릭→ 폴더 우 클릭 후 [Dialog 삽입]을 클릭해 대화상자 추가 →우측 끝에 도구 상자에서 edit Control과 static Text로 추가 → 속성에서 Cpation 입력.
19
[실습하기 4-1] 상수 값 입력 대화상자 대화상자 더블클릭 → [MFC 클래스 추가 마법사] 대화상자에서 새로 추가된 대화상자를 추가하기 항목 입력 생성된 edit box에 변수 할당: [클래스 마법사]의 대화상자의 클래스 이름 항목에서 CConstantDlg Class을 선택한 뒤 [맴버 변수] 탭 → 컨트롤 ID 항목에서 ID_EDIT1을 선택하고 [변수 추가] 버튼을 클릭 → [멤버 변수 추가 마법사] 대화상자에서 다음과 같이 실수형 변수를 선언 → [마침] 버튼 클릭 * 변수형식 double 은 최소, 최대값을 입력이 안되지만, 안 써도 문제가 없음. 컨트롤 ID 변수 이름 범주 변수 형식 최소값 최대값 IDC_EDIT1 m_Constant Value double 255
20
[실습하기 4-1] 상수 값 입력 대화상자 Doc 클래스에서 사용하기 위해 ConstantDlg.h 선언
#include "ImageProcessingDoc.h" #include "DownSampleDlg.h" #include "UpSampleDlg.h" #include "QuantizationDlg.h" #include "math.h" #include "ConstantDlg.h" // 상수 입력 대화상자 사용을 위한 헤더 선언
21
[실습하기 4-2] 상수 값 상수 덧셈 프로그램 리소스 뷰 창에서 [Menu]-[IDR_IMAGETYPE] 더블클릭 → 메뉴 추가 [클래스 마법사] 대화상자를 이용해 추가된 메뉴에서 화소 값의 덧셈을 실행하는 함수 추가 →개체 ID에서 ID_SUM_CONSTANT를 찾은 후에 메시지에 있는 common을 누른 후에 처리기 추가누르기.
22
[실습하기 4-2] 상수 값 상수 덧셈 프로그램 ③ Doc 클래스의 OnSumConstant 함수에 미리 작성한 [상수 입력] 대화상자를 호출하여 상수 값을 입력받아 화소 값의 덧셈연산을 수행하는 프로그램 작성
23
[실습하기 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); // 상수 값과 화소 값과의 덧셈 }
24
[실습하기 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); }
25
[실습하기 4-2] 상수 값 상수 덧셈 프로그램 프로그램 실행 결과 영상
상수 덧셈 프로그램 구현 결과[원본 영상(왼쪽), 결과 영상+30(오른쪽)]
26
[실습하기 4-3] 화소 값의 상수 뺄셈 프로그램 리소스 뷰 창에서 [Menu]-[IDR_IMAGETYPE] 더블클릭 → 메뉴 추가 [클래스 마법사] 대화상자를 이용해 추가된 메뉴에서 화소 값의 덧셈을 실행하는 함수 추가 Doc 클래스의 OnSubConstant 함수에 미리 작성한 [상수 입력] 대화상자를 호출하여 상수 값을 입력받아 화소 값의 뺄셈연산을 수행하는 프로그램 작성
27
[실습하기 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); // 상수 값과 화소 값과의 뺄셈 }
28
[실습하기 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); }
29
[실습하기 4-3] 화소 값의 상수 뺄셈 프로그램 프로그램을 실행 결과 영상
상수 뺄셈 프로그램 구현 결과[원본 영상(왼쪽), 결과 영상 -50(오른쪽)]
30
[실습하기 4-4] 화소 값의 상수 곱셈 프로그램 리소스 뷰 창에서 [Menu]-[IDR_IMAGETYPE] 더블클릭 → 메뉴 추가 [클래스 마법사] 대화상자에서 추가된 메뉴에서 화소 값의 곱셈을 실행하는 함수 추가 Doc 클래스의 OnMulConstant 함수에 미리 작성한 [상수 입력] 대화상자를 호출하여 상수 값을 입력받아 화소 값의 곱셈연산을 수행하는 프로그램 작성
31
[실습하기 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); // 상수 값과 화소 값 곱셈 }
32
[실습하기 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); }
33
[실습하기 4-4] 화소 값의 상수 곱셈 프로그램 프로그램을 실행 결과 영상
상수 곱셈 프로그램 구현 결과[원본 영상(왼쪽), 결과 영상X2(오른쪽)]
34
[실습하기 4-5] 화소 값의 상수 나눗셈 프로그램
리소스 뷰 창에서 [Menu]-[IDR_IMAGETYPE] 더블클릭 → 메뉴 추가 [클래스 마법사] 대화상자에서 추가된 메뉴에서 화소 값의 나눗셈을 실행하는 함수 추가 Doc 클래스의 OnDivConstant 함수에 미리 작성한 [상수 입력] 대화상자를 호출하여 상수 값을 입력받아 화소 값의 나눗셈연산을 수행하는 프로그램
35
[실습하기 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); // 상수 값과 화소 값 나눗셈 }
36
[실습하기 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); }
37
[실습하기 4-5] 화소 값의 상수 나눗셈 프로그램
프로그램 실행 결과 영상 상수 나눗셈 프로그램 구현 결과[원본 영상(왼쪽), 결과 영상 /2(오른쪽)]
38
디지털 영상의 논리연산 화소 값의 AND 연산 원하는 비트를 선택적으로 0으로 만드는 기능이 있어 마스크(mask) 연산이라고도 함 영상의 특정 화소 비트에서 0으로 구성된 이진 데이터와 AND 연산을 수행
39
디지털 영상의 논리연산(계속) 화소 값의 OR 연산
특정 비트를 선택적으로 1로 구성할 수 있어 선택적-세트(selective-set)연산이라고도 함 화소의 특정 비트를 1로 만들려고 원하는 비트 위치가 1로 구성된 이진 데이터와 OR 연산을 수행
40
화소 값의 XOR 연산 디지털 영상의 논리연산(계속)
입력이 서로 다를 때만 1을 출력하는 연산으로, 두 데이터를 비교하므로 비교(compare)연산이라고도 함 같은 비트에서만 0을 출력함
41
디지털 영상의 논리연산(계속) 화소 값의 NOT 연산 화소 비트를 반전시키는 일을 함.
영상에서는 검정색이 흰색으로, 흰색이 검정색으로 반전됨
42
[실습하기 4-6] 화소 값의 AND 프로그램 리소스 뷰 창에서 [Menu]-[IDR_IMAGETYPE] 더블클릭 → 메뉴 추가 [클래스 마법사] 대화상자를 이용해 Doc 클래스와 View 클래스에 함수 추가
43
[실습하기 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);
44
[실습하기 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); }
45
영상의 화소 값에 상수 128을 AND 연산한 결과 영상
프로그램 실행 결과 영상 영상의 화소 값에 상수 128을 AND 연산한 결과 영상
46
[실습하기 4-7] 화소 값의 OR 프로그램 리소스 뷰 창에서 [Menu]-[IDR_IMAGETYPE] 더블클릭 → 메뉴 추가
[클래스 마법사] 대화상자를 이용해 Doc 클래스와 View 클래스에 함수 추가 Doc 클래스의 OnOrOperate 함수에 다음 프로그램 추가
47
[실습하기 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);
48
[실습하기 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); }
49
[실습하기 4-7] 화소 값의 OR 프로그램 프로그램 실행 결과 영상 영상의 화소 값에 상수 128을 OR 연산한 결과 영상
50
[실습하기 4-8] 화소 값의 XOR 프로그램 리소스 뷰 창에서 [Menu]-[IDR_IMAGETYPE] 더블클릭 → 메뉴 추가 [클래스 마법사] 대화상자를 이용해 Doc 클래스와 View 클래스에 함수 추가 Doc 클래스의 OnXorOperate 함수에 다음 프로그램 추가
51
[실습하기 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);
52
[실습하기 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); }
53
영상의 화소 값에 상수 128을 XOR 연산한 결과 영상
프로그램 실행 결과 영상 영상의 화소 값에 상수 128을 XOR 연산한 결과 영상
54
Section 03 디지털 영상의 다양한 화소 점 처리 기법
Output(q) = T[Input(p)] p는 입력 영상의 화소 값이고, T로 화소 값을 변환함 q는 값을 변환하여 얻는 출력 화소 값 명암 변환(Intensity Transform) 밝기를 변경하는 것 미리 지정된 변환 함수를 기반으로 입력 영상의 이전 화소를 새로운 화소로 변환하는 점 처리 기법
55
입력 영상을 출력 영상으로 변환해도 변화가 없는 것 단순히 입력 화소를 출력 화소로 바꾸는 변환
널 변환(Null Transform) 입력 영상을 출력 영상으로 변환해도 변화가 없는 것 단순히 입력 화소를 출력 화소로 바꾸는 변환 널 변환의 변환 함수 Output(q) = Input(p)
56
영상의 반전 변환(Negative Transform)
사진학적 역변환 각 화소의 값이 영상 내에 대칭이 되는 값으로 변환 8비트 그레이 레벨의 영상을 반전시키면 화소 값 0번은 255번으로, 화소 값 1번은 254번으로 변환됨 반전 변환의 변환 함수 Output(q) = Input(p)
57
감마 보정(Gamma Correction)
입력 값을 조정하여 출력을 제대로 만드는 과정 감마 보정 함수 Output(q) = [Input(p)](1/ ) 함수의 감마 값( )에 따라 영상을 밝게 하거나 흐리게 조절할 수 있음 감마 값이 1보다 크면 영상이 어두워지고, 1보다 작으면 영상이 밝아짐
58
명암 대비 변환(Intensity Contrast Transform)
명암 대비 스트레칭(Intensity Contrast Stretch) 밝기의 차이를 크게 하는 것 영상의 가장 밝은 값을 최대 밝게, 가장 어두운 값을 최대 어둡게 설정하여 높은 명암 대비를 보이는 영상을 생성하는 것 명암 대비 압축(Intensity Contrast Compress) 영상의 가장 어두운 값을 밝게, 가장 밝은 값을 어둡게 하여 밝기 차이를 줄임으로써 낮은 명암 대비를 보이는 영상을 생성하는 것
59
명암 대비 변환(Intensity Contrast Transform)(계속)
60
경계 값을 이용한 처리 경계 값을 이용한 처리 디지털 영상의 화소 값을 주어진 경계 값으로 그룹화하여 결국 화소 값의 수를 감소시키는 처리 방법
61
영상에서 화소에 있는 명암 값의 범위를 경계 값으로 축소
포스터라이징 (Posterizing) 영상에서 화소에 있는 명암 값의 범위를 경계 값으로 축소 경계 값 8개로 8비트 그레이 레벨 영상을 포스터라이징 처리하면, 명암 값 256개가 명암 값 8개로 변경됨.
62
경계 값을 이용해 값이 두 개만 있는 영상으로 변환해 주는것 보통 그레이 레벨 영상을 이진 영상으로 변환할 때 사용
이진화 (Binarization) 경계 값을 이용해 값이 두 개만 있는 영상으로 변환해 주는것 보통 그레이 레벨 영상을 이진 영상으로 변환할 때 사용 값이 두 개뿐이라서 영상을 쉽게 분석할 수 있고, 명암 대비가 매우 낮은 영상에서는 배경과 물체를 확실하게 구분할 수 있게 해줌.
63
영상에서 한 부분의 화소는 원 상태를 그대로 유지한 채 일정 범위의 화소만 강조하는 변환
범위 강조 변환 영상에서 한 부분의 화소는 원 상태를 그대로 유지한 채 일정 범위의 화소만 강조하는 변환 원하는 부분의 화소 값이 더 커지거나 작아져 다른 부분과 비교해서 더욱 도드라져 보임.
64
[실습하기 4-9] 영상을 반전시키는 프로그램 리소스 뷰 창에서 [Menu]-[IDR_IMAGETYPE] 더블클릭 → 메뉴 추가 [클래스 마법사] 대화상자를 이용해 Doc 클래스와 View 클래스에 함수 추가
65
[실습하기 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] = m_InputImage[i]; // 영상 반전을 수행 }
66
[실습하기 4-9] 영상을 반전시키는 프로그램 View 클래스의 OnNegaTransform 함수에 다음 프로그램 추가
void CImageProcessingView::OnNegaTransform() { // TODO: Add your command handler code here CImageProcessingDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pDoc->OnNegaTransform(); Invalidate(TRUE); }
67
[실습하기 4-9] 영상을 반전시키는 프로그램 프로그램 실행 결과 영상 영상 반전 프로그램을 구현한 결과 영상
68
감마 보정하는 함수 : Output(q) = [Input(p)](1/Γ)
[실습하기 4-10] 감마 보정 프로그램 감마 보정하는 함수 : Output(q) = [Input(p)](1/Γ) Γ값은 영상의 산술연산에서 사용한 [상수 입력] 대화상자를 이용하여 입력받도록 함. 리소스 뷰 창에서 [Menu]-[IDR_IMAGETYPE] 더블클릭 → 메뉴 추가 [클래스 마법사] 대화상자를 이용해 Doc 클래스와 View 클래스에 함수 추가
69
[실습하기 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; }
70
[실습하기 4-10] 감마 보정 프로그램 View 클래스의 OnGammaCorrection 함수에 다음 프로그램 추가
void CImageProcessingView::OnGammaCorrection() { // TODO: Add your command handler code here CImageProcessingDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pDoc->OnGammaCorrection(); Invalidate(TRUE); }
71
감마 보정 프로그램을 구현한 결과 영상(r = 0.85)
[실습하기 4-10] 감마 보정 프로그램 프로그램 실행 결과 영상 감마 보정 프로그램을 구현한 결과 영상(r = 0.85)
72
영상의 이진화는 임의의 경계 값(Threshold)을 이용
[실습하기 4-11] 영상의 이진 프로그램 영상의 이진화는 임의의 경계 값(Threshold)을 이용 임의의 경계 값은 영상의 산술연산에서 사용한 [상수 입력] 대화상자를 이용해 입력받도록 함 리소스 뷰 창에서 [Menu]-[IDR_IMAGETYPE] 더블클릭 → 메뉴 추가 [클래스 마법사] 대화상자를 이용해 Doc 클래스와 View 클래스에 함수 추가
73
[실습하기 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 출력 }
74
[실습하기 4-11] 영상의 이진 프로그램 View 클래스의 OnBinarization 함수에 다음 프로그램 추가
void CImageProcessingView::OnBinarization() { // TODO: Add your command handler code here CImageProcessingDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pDoc->OnBinarization(); Invalidate(TRUE); }
75
영상의 이진 프로그램을 실습한 경과 영상(경계 값 = 130)
[실습하기 4-11] 영상의 이진 프로그램 프로그램 실행 결과 영상 영상의 이진 프로그램을 실습한 경과 영상(경계 값 = 130)
76
[실습하기 4-12] 범위를 강조하는 변환 프로그램
화소 값의 범위를 선택하려고 다음과 같이 대화상자를 만듦.
77
[실습하기 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" // 범위 강조 대화상자를 위한 헤더 선언
78
[실습하기 4-12] 범위를 강조하는 변환 프로그램
생성된 edit box에 변수 할당: [클래스 마법사]의 대화상자의 클래스 이름 항목에서 CConstantDlg Class을 선택한 뒤 [맴버 변수] 탭 → 컨트롤 ID 항목에서 ID_EDIT1과 ID_EDIT2를 각각 선택하고 [변수 추가] 버튼을 클릭 → [멤버 변수 추가 마법사] 대화상자에서 다음과 같이 실수형 변수를 선언 → [마침] 버튼 클릭 [리소스뷰] 창에서 [Menu]-[IDR_IMAGETYPE] 폴더를 더블클릭 하여 메뉴 추가 컨트롤 ID 변수 이름 범주 변수 형식 최소값 최대값 IDC_EDIT1 m_StratPoint Value int 255 m_EndPoint
79
[실습하기 4-12] 범위를 강조하는 변환 프로그램
[클래스 마법사] 대화상자를 이용해 범위 강조 변환을 수행하는 함수 추가
80
[실습하기 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]; }
81
[실습하기 4-12] 범위를 강조하는 변환 프로그램
View 클래스의 OnStressTransform 함수에 다음 프로그램 추가 void CImageProcessingDoc::OnStressTransform() { // TODO: Add your command handler code here CImageProcessingDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pDoc-> OnStressTransform (); Invalidate(TRUE); }
82
[실습하기 4-12] 범위를 강조하는 변환 프로그램
프로그램 실행 결과 영상 범위 강조하여 변환한 결과 영상(범위 : 100~150)
83
컬러 영상에는 다양한 색상이 있으므로 화소는 색의 밝기를 표현함
화소 점 처리 원 화소의 값이나 위치를 바탕으로 단일 화소 값이 각각 독립적으로 변경되는 기술 컬러 영상에는 다양한 색상이 있으므로 화소는 색의 밝기를 표현함 RGB 영상에서는 빨간색의 R 채널, 초록색의 G 채널, 파란색의 B 채널 영상이 각 화소를 8비트로 표현함. AND 연산과 OR 연산 특정 비트를 0으로 바꾸려면 특정 비트 위치가 0으로 구성된 이진 데이터와 AND 연산 수행 특정 비트를 1로 구성하려면 특정 비트 위치가 1로 설정된 이진 데이터와 OR 연산 수행 XOR 비교연산. 화소 비트와 임의의 이진 비트를 XOR해서 대응되는 비트의 값이 같으면 화소의 해당 비트를 0으로 구성 NOT 연산 화소 비트를 반전시킴(검정색은 흰색으로, 흰색은 검정색으로)
84
명암 대비 스트레칭 포스터라이징 이진화 범위 강조 변환
높은 명암 대비를 보이는 영상을, 명암 대비 압축은 낮은 명암 대비를 보이는 영상을 생성하는 것 포스터라이징 영상에서 화소에 있는 명암 값의 범위를 경계 값으로 축소하는 기법 이진화 영상의 화소 값을 경계 값을 이용해 값이 두 개만 있는 영상으로 변환해 주는 것 범위 강조 변환 영상에서 한 부분의 화소는 원 상태를 그대로 유지한 채 일정 범위의 화소만 강조하는 변환
Similar presentations