Download presentation
Presentation is loading. Please wait.
Published byStewart Stevens Modified 6년 전
1
6장 히스토그램 처리 차 례 히스토그램의 개요 히스토그램의 용도 영상 이치화 히스토그램 평활화 히스토그램 스트레칭
차 례 히스토그램의 개요 히스토그램의 용도 영상 이치화 히스토그램 평활화 히스토그램 스트레칭 자동 이치화 (Otzu method)
2
히스토그램(Histogram)? ▶수평축: 영상의 밝기(intensity) 값 ▶수직축: 수평축의 밝기값에 대응되는 크기를 가진 픽셀 수가 영상 안에서 몇 개나 있는지 나 타내는 빈도수(frequency) ▶ 흑백영상의 경우 수평축은 0~255의 범위, 수직축의 값은 영상의 크기와 밝기의 분포에 따라 달라짐 그림 6-2 흑백영상에 대한 히스토그램 그림 6-1 샘플영상에 대한 히스토그램
3
밝기분포가 다른 영상의 예 그림 6-3 영상의 밝기 변화에 따른 히스토그램 차이
4
1. 히스토그램 용도 1 화질향상 2. 물체인식 그림 6-4 화질 향상의 예 (원 영상: 처리된 영상)
그림 6-5 이치화 후, 255값을 가지는 영역 및 위치를 자동추출
5
영상 이치화(binarization) 그림 6-6 히스토그램 정보를 이용한 물체와 배경의 분리
▶ 원본 영상: 픽셀의 밝기값이 0~255사이에 골고루 존재 ▶ 이치화 영상: 픽셀의 밝기값이 0 아니면 255의 두 값 중 하나를 가짐
6
이치화(binarization)의 임계치(threshold)
히스토그램을 이용한 이치화(산과 계곡의 분리) 물체(동전): 170부근, 배경: 50부근
7
2. 히스토그램 출력 프로그램의 구현 <Workspace>의 클래스뷰 탭에서 CWinTest Doc 클래스에 마우스를 대고 오른쪽 버튼을 클릭해 새로운 <멤버변수>를 추가한다. 추가할 멤버변수는 m_HistroArr[256]로 정수형 배열이다. 오픈된 대화창의 <Variable Type>부에는 “int”를, <Variable Name>에는 “m_HistroArr[256]”를 입력한다. 이 배열의 접근 타입은 <Protected>로 한다. 즉, CWinTest Doc 클래스 밖에서는 이 배열을 접근할 수 없도록 하여 데이터를 보호해준다. 멤버배열 데이터 삽입 후 해당 클래스의 헤드파일을 열어보면 배열이 삽입되었다. 그림 6-7 새 멤버 변수의 추가 그림 6-8 멤버 변수의 입력 그림 6-9 입력된 멤버변수의 확인
8
2. 히스토그램 출력 프로그램의 구현 다시 <Workspace>의 클래스뷰 탭에서 CWinTestDoc 클래스에 마우스를 대고 오른 쪽 버튼을 클릭해 새로운 멤버를 추가한다. 이번에는 멤버함수를 추가한다. 오픈된 대화창에 “void”형의 “m_ImgHisto(int height, int width)” 함수를 입력한다. 그림 6-11 멤버 함수의 입력 그림 6-10 새 멤버 함수의 추가 추가된 멤버함수에 히스토그램을 계산하는 [리스트 6-1 히스토그램 계산함수 의 구현] 코드를 입력한다.
9
히스토그램 출력 프로그램의 구현 히스토그램 처리함수를 호출하는 메뉴명령을 추가해보자. 먼저 [그림 6-12]처럼 <Workspace>의 리소스뷰 탭에서 메뉴를 편집한다. 빈 메뉴 부분에 마우스를 대고 클릭하면 [그림 6-13]처럼 메뉴입력 대화창이 열린다. [그림 6-13]에 주어진 것 처럼 메뉴작성에 필요한 항목을 입력한다. 추가된 메뉴항목<히스토그램>에 마우스를 대고 오른쪽 버튼을 클릭하면 [그림 6-14]의 팝업메뉴가 출력되는데 여기서 <ClassWizard>부분을 클릭한다. 그림 6-12 새 메뉴의 입력 그림 6-14 클래스 마법사의 호출 그림 6-13 메뉴 항목의 작성
10
히스토그램 출력 프로그램의 구현 오픈된 클래스위자드 입력창에서 [그림 6-15]에 주어진 순서로 입력한다.
먼저 (1)의 <Class name>부에서 [CWinTestView]를 선택한다. 다음 (2)의 <Object IDs>부에서 [IDM_IMGHISTO]를 선택한다. 이 ID는 [그림 6-13]에서 히스토그램처리 명령을 호출하기 위해 만들어 주었던 메뉴의 ID이다. 다음 (3)의 <Messages>부에서 [COMMAND]를 선택하고, 멤버함수를 추가하기 위해 (4)버튼을 클릭한다. 오픈된 멤버함수 입력창에는 기본으로 주어지는 멤버함수가 입력되어 있다. 이것을 바꾸지 말고 바로 (5)의 [OK]버튼을 클릭한다. 그림 6-15 멤버 함수의 입력
11
히스토그램 출력 프로그램의 구현 [OK]버튼을 클릭하면 새로운 멤버함수가 CWinTestView 클래스 아래에 추가되고 이 함수는 [그림 6-16]의 (6)처럼 나타난다. 이 부분을 두 번 클릭하거나 (7)의 코드 편집 버튼을 누르면 추가된 멤버함수를 편집하는 것이 가능하다. 그림 6-16 멤버 함수의 편집
12
3. 히스토그램을 이용한 영상이치화 프로그램의 구현
영상이치화는 픽셀기반 연산의 가장 단순한 예로 입력영상을 0과 255 en 값 중 하나로 바꾸는 작업을 수행한다. 이치화를 처리하는 메뉴를 삽입하자. <Workspace>의 리소스뷰 탭을 선택해 메뉴편집부로 들어간다. [그림 6-18]처럼 빈 메뉴부분에 대고 클릭하면 [그림 6-19]의 입력창이 열리며 ID, Caption, Prompt부분을 입력한다. [그림 6-20]은 새롭게 입력된 <영상이진화>를 보여준다. 이 메뉴 부분에 마우스를 대고 오른쪽 버튼을 클릭하여 <ClassWizard> 부분을 선택한다. 그림 6-20 클래스 마법사 호출 그림 6-18 이치화 처리메뉴 추가 그림 6-19 이치화처리 메뉴의 입력
13
3. 히스토그램을 이용한 영상이치화 프로그램의 구현
[그림 6-21]처럼 클래스 위자드 대화창이 열리면 히스토그램 출력함수의 작성에서 처리했던 순서로 새로운 멤버함수를 CWinTestView 클래스 아래에 추가한다. 추가된 멤버함수를 편집하기 위해 [그림 6-22]에 있는 <Edit Code>버튼을 클릭하여 추가된 멤버함수 OnBinarization으로 이동한다. 그림 멤버함수의 입력 그림 6-22 추가된 멤버함수로 이동
14
3. 히스토그램을 이용한 영상이치화 프로그램의 구현
리스트 6-3]은 이진영상화를 수행하는 함수의 코드를 보여준다. 11행을 보면 입력된 영상을 이치화하기 위한 임계치를 “100”으로 사용하고 있다. 이 임계치를 바꾸면 이치화 영상은 달라진다. 코드 및 메뉴작성이 끝났으므로 컴파일하여 실행한다. [그림 6-23]은 실행의 예를 보여준다. 입력영상의 픽셀밝기값이 100보다 작으면 0의 값으로 크면 255 값으로 바꾸어진 결과영상이 출력된다. 그림 6-23 영상 이치화 연산의 실행
15
4. 슬라이드 컨트롤을 이용한 영상이진화의 동적제어
MFC의 슬라이드 컨트롤을 이용하여 임계치를 동적으로 입력해 주는 함수를 작성한다. 슬라이드 컨트롤의 움직임에 따라 영상이치화가 동적으로 실행되는 프로그램을 작성하자. 1 다이얼로그의 작성 <Workspace>의 리소스뷰 텝을 선택하고 리소스 중에서 다이얼로그 부분에 마우스를 대고 오른쪽 버튼을 클릭하면 [그림6-24]와 같은 메뉴가 나타난다. 여기서 <Insert Dialog>를 선택한다. 그림 6-24 새로운 다이얼로그박스의추가 버턴 제거 그림 6-25 다이얼로그박스의 편집
16
4. 슬라이드 컨트롤을 이용한 영상이진화의 동적제어
[그림 6-26]처럼 오른쪽에 있는 툴박스에서 몇 가지 컨트롤을 가져와 다이얼로그박스에 첨가한다. 슬라이드바와 버튼, 에디터박스 등을 붙여준다. 다이얼로그박스에 붙여준 툴들의 특성을 입력한다. 먼저, [그림 6-27]에서 에디터박스를 마우스로 선택(1)하여 오른쪽 버튼을 누르면 팝업메뉴가 나타나고 이 메뉴에서 <Properties>를 선택(2)한다. 입력창이 뜨면 <Style>탭을 선택(3)한 후 <Align text>부분은 [Right]로 선택(4) 하고 <Ready-only> 부분에도 체크(5) 한다. 그림 6-26 다이알로그 박스에 툴들을 추가 설정한 두 옵션은 에디터박스가 입력은 받아들이지 않고 정보의 출력만으로 사용되며 오른쪽 끝에 맞추어 출력한다 는 것을 지정한 것이다. 그림 6-27 에디터 박스 특성 입력
17
슬라이드 컨트롤을 이용한 영상이진화의 동적제어
에디터박스의 경우처럼 명령입력 버튼에 대해서도 특성을 입력한다. <ID>부에 [IDC_BUTTON1]을 입력하고 <Caption>부에는 [종료]라고 입력한다. 그림 6-28 명령버튼의 특성 입력
18
슬라이드 컨트롤을 이용한 영상이진화의 동적제어
다이얼로그박스에 대응하는 클래스를 작성하기 위해 클래스위자드를 이용한다. [그림 6-29]의 (1)의 부분에 마우스를 대고 오른쪽 버튼을 누르면 팝업메뉴가 나타나고 여기서 (2)의 <ClassWizard>를 선택한다.클래스위자드가 수행되면서 새로운 클래스를 삽입할지 묻는다. (3)의 <OK>버튼을 클릭하면 바로 [그림 6-30] 의 클래스 정보 입력 창이 열린다. <Name>부에 [CBinCntrlDlg]라고 입력하고 [OK]버튼을 클릭한다. 그림 6-29 다이얼로그 박스에 대한 클래스의 작성 그림 다이얼로그 클래스 이름 입력
19
슬라이드 컨트롤을 이용한 영상이진화의 동적제어
종료버튼이 눌러졌을 때 멤버함수를 작성해보자. [그림 6-31]에 주어진 것 처럼 다이얼로그 클래스 CBinCntrDlg 아래에 새로운 멤버함수를 추가한다. 멤버함수를 추가한 후, 이 멤버함수를 편집하기 위해 [그림 6-31]의 <Edit Code>버튼을 이용하여 함수를 편집한다. [리스트 6-4]처럼 코드를 입력한다. [리스트 6-4] 그림 6-31 종료버튼에 대한 멤버함수의 추가
20
슬라이드 컨트롤을 이용한 영상이진화의 동적제어
다시 클래스위자드를 오픈하여 <Class name>부에서 [CBinCntrlDlg]클래스를 선택한 다음 <member Variables>탭을 클릭(1)한다. 다음 <Control IDs>부에서 에디터박스를 가리키는 (2)번의 [IDC_EDTTI]를 선택하고 (3)번의 <Add Variable>버튼을 클릭한다. 변수명은 [m_binValDisp]으로 하고 <Member variable name>에 입력(4)한다. 변수의 <Category>는 [Value]로 하고(5) <Variable type>는 [int]로 설정(6)한다. 그림 6-32 에디터박스 대응 변수의 추가 및 추가변수 이름 입력
21
슬라이드 컨트롤을 이용한 영상이진화의 동적제어
추가한 정수의 범위를 설정하자. [그림 6-33]처럼 최소값과 최대값을 설정해 준다. 이치화 임계 치 는 0보다 크고 355보다 작아야 하므로 최대 및 최소값을 0과 255로 설정해주었다. 그림 6-33 추가변수의 범위 설정
22
슬라이드 컨트롤을 이용한 영상이진화의 동적제어
에디터박스에 대한 속성처럼 슬라이드바에 대한 속성도 유사하게 설정해보자. <Control IDs>에서 [idc_SLIDER1]을 선택한 후, [add Variable]버튼을 클릭한다. 클릭 후 오픈된 대화창에 [그림 6-34]에 주어진 속성을 설정한다. 단, <Category>는 Value가 아니라 [Control]이고 <Variable type>은 슬라이드컨트롤 타입인 [CSliderCtrl]로 선택한다. 그림 6-34 슬라이드 컨트롤 변수 추가 와 속성 설정
23
슬라이드 컨트롤을 이용한 영상이진화의 동적제어
다이얼로그 클래스 헤드파일인 <BinCntrlDlg.h> 파일을 열어보면 추가된 멤버변수들을 확인할 수 있다. [그림 6-35]는 추가된 두 개의 멤버변수들을 보여준다. 그림 6-35 추가된 두 멤버변수들의 확인
24
슬라이드 컨트롤을 이용한 영상이진화의 동적제어
다이얼로그박스를 열 때 실행되는 초기화함수를 작성하자. 다이얼로그 박스 내에는 여러 가지 컨트롤들과 컨트롤에 연관된 변수들이 있으므로 이러한 변수들의 초기화가 필요하다. 클래스위자드를 오픈하여 <Class name>에 [CBInCntrDlg]를 선택(1)하고 <Object IDs>에는 [CBInCntrDlg](2)를 <Messages>부에는 [WM_INITALOG]를 선택(3) 한다. 다음 <Add function>버튼(4)를 누르면 <Member functions>부에 [그림 6-36]처럼 새로운 멤버함수 OnInitDialog가 추가(5)되게 된다. 마지막으로 <Edit Code>버튼(6)을 눌러 이 함수를 편집하자. 그림 6-36 다이얼로그 초기화 멤버함수의 추가
25
슬라이드 컨트롤을 이용한 영상이진화의 동적제어
다음으로 슬라이드컨트롤이 있는 다이얼로그박스에서 설정이치화임계값을 받아 이치화를 수행하는 함수를 작성한다. 이치화처리함수는 CWinTestDoc 클래스 아래에 추가한다. [그림 6-37]처럼 <Workspace>d의 클래스뷰 탭에서 <CWinTestDoc> 클래스 부분을 선택한 후 마우스의 오른쪽 버튼을 클릭하여 <Add Member Function>부분을 클릭한다. 출력된 대화창에 [그림 6-38]처럼 함수의 타입과 함수의 선언부를 입력한다. 그림 6-37 이치화 멤버함수의 추가 그림 6-38 이치화 멤버함수 입력
26
슬라이드 컨트롤을 이용한 영상이진화의 동적제어
CBinCntrlDlg 클래스의 함수에서 도큐먼트 클래스의 멤버 테이터에 접근하기 위해 메일프레임, 도큐먼트 클래스의 인스턴트 주소를 참조해야 하므로 [그림 6-39]처럼 BinCntrlDlg.cpp파일의 상부에 해당 클래스의 헤드파일을 첨가하여 준다. 슬라이드 컨트롤의 동작에 대응하는 함수를 작성하기 위해 [그림 6-40]처럼 슬라이드를 선택한 후 오른쪽 마우스 버튼을 클릭하면 팝업메뉴가 화면에 나타난다. 여기서 클래스위자드를 선택한다. 그림 6-39 헤드파일의 추가 그림 6-40 슬라이드컨트롤 함수의 추가
27
슬라이드 컨트롤을 이용한 영상이진화의 동적제어
클래스 위자드 대화창에서 [그림 6-41]에서 주어진 번호처럼 차례로 필요한 설정을 수행한다. (3)번의 NM_CUSTOMDRAW는 슬라이드가 움직일 때마다 추가한 멤버함수가 호출되는 옵션이다. 그림 6-41 슬라이드컨트롤 멤버 함수의 추가
28
슬라이드 컨트롤을 이용한 영상이진화의 동적제어
3 동적 이치화 실행 메뉴와 호출함수의 작성 <Workspace>의 리소스뷰 탭의 메뉴편집창에서 [그림 6-42]처럼 빈 메뉴를 클릭하여 [그림 6-43]에서 보는 바와 같이 메뉴 설정값들을 입력한다. 그림 6-43 메뉴 설정값 입력 [동적이진화] 연산함수를 호출하기 위한 함수를 작성하자. 메뉴의 <동적 이진화> 위치에 마우스를 대고 오른 쪽 버튼을 클릭하여 클래스위자드를 호출한다. 그림 6-42 동적 이치화 메뉴추가 그림 6-44 클래스 마법사 실행
29
슬라이드 컨트롤을 이용한 영상이진화의 동적제어
[그림 6-45]에 주어진 순서처럼 클래스위자드로에서 뷰 클래스 함수를 추가한다. 뷰 클래스에서 슬라이드가 있는 다이얼로그 클래스 CBinCntrlDlg를 호출하기 위해 다이얼로그 클래스 헤드파일을 WinTestView.cpp 파일부에 삽입해준다. 그림 6-45 뷰클래스에 동적이치화 호출 멤버함수의 추가 그림 6-46 다이얼로그 클래스 헤드파일 추가
30
슬라이드 컨트롤을 이용한 영상이진화의 동적제어
동적이치화 호출함수를 [리스트 6-8]처럼 구현한다. 프로그램 작성이 끝났으므로 컴파일하여 실행한다. [그림 6-47]은 실행의 예를 보여준다. 그림 6-47 동적이진화를 위한 슬라이드 컨트롤
31
히스토그램 계산
32
임계치 변화 vs. Image [그림 6-48]처럼 슬라이드박스를 띄운 상태에서 슬라이드 위치를 변화시켜 보자. 슬라이드의 움직임에 따라 영상의 이치화가 자동으로 변하며 나타난다. 낮은 임계치 중간 임계치 높은 임계치 그림 6-48 슬라이드 이동에 따른 이치화 영상의 변화
33
5. 히스토그램 평활화(equalization)
픽셀들이 특정 밝기 영역에 몰려있음 픽셀들이 여러 밝기 영역으로 넓게 퍼지며 분포하게 됨 양쪽으로 일정하게 당긴 것에 불과 그림 6-49 히스토그램 평활화
34
평활화 단계 평활화 - 누적히스토그램으로부터 정규화합 히스토그램을 구함 정규화합 =누적합X(7/16)
c.f) 누적 히스토그램 H(i)는 항상 255근방에서 전체 픽셀수 Nt 와 같아지기 때문에 h(255)=Gmax가 됨. 따라서, 평활화 식은 원본 히스토그램 을 0~255범위로 펴는 효과를 나타냄 평활화 단계 평활화 - 누적히스토그램으로부터 정규화합 히스토그램을 구함 H(i): 누적 히스토그램 h(i): 정규화합 히스토그램 정규화합 =누적합X(7/16)
35
리스트 6-9 히스토그램 평활화 멤버함수의 작성 void m_HistoEqual(int height, int width) {
unsigned int *histogram = new unsigned int [256]; unsigned int *sum_hist = new unsigned int [256]; // histogram배열을 초기화 for(i=0; i<256; i++) histogram[i]=0; // 영상의 histogram을 계산 for(i=0; i<height; i++) for(j=0; j<width; j++) histogram[ m_InImg[i][j] ]++; int sum=0; float scale_factor=255.0f/(float)(height*width); // histogram의 정규화된 합 히스토그램을 계산 for(i=0; i<256; i++) sum += histogram[i]; sum_hist[i] =(int)((sum*scale_factor) + 0.5); } // LUT로써 정규화합(sum_hist)배열을 사용하여 영상을 변환 for(i=0; i<height; i++) // (변환영상은 m_OutImg에 저장) for(j=0; j<width; j++) m_OutImg[i][j]=sum_hist[m_InImg[i][j]]; // 메모리를 해제 delete []histogram; delete []sum_hist;
36
히스토그램 스트레칭(stretching)
37
히스토그램 지정 (Histogram specification)
히스토그램 지정이란? 원본영상을 처리한 출력영상의 히스토그램 모양이 우리가 원하는 대로 나오도록 임의로 지정하는 것 원 입력영상 지정한 히스토그램 영상 변환된 영상 그림 6-59 히스토그램 지정연산의 수행
38
히스토그램 지정연산의 원리
39
히스토그램 지정연산의 구현 그림 6-61 히스토그램 지정을 위한 두 메뉴의 추가
그 림 6-62 히스토그램 지정연산을 위한 두 멤버함수의 추가
40
히스토그램 지정연산의 구현 그림 6-63 히스토그램 지정연산 호출함수의 추가
그림 히스토그램 지정연산 호출함수의 추가 그림 6-64 클래스마법사를 이용한 히스토그램 지정연산 호출 함수
41
히스토그램 지정연산의 구현 그림 6-65 히스토그램 지정연산을 처리할 입력영상
그림 6-66 모델 히스토그램을 가진 영상의 입력 그림 6-67 히스토그램 지정 연산의 수행
42
자동 이치화 Otzu Method - Gray 영상에서 물체 및 배경 분리에 사용
- 히스토그램 작성 후, 히스토그램의 두 피크(peak)를 찾아냄 - 히스토그램 분포의 통계적 특성을 이용한 자동 임계값 결정 - 히스토그램 분포를 두 개의 정규분포로 모델링 - 평균과 t를 잘 선택해야 두 그룹의 분산 값을 줄일 수 있음 t=? 참고문헌: Computer and Robot Vision, R.M.Haralick, L.G. Shapiro, Addison Wesley
43
자동 이치화 높은 유사성(high homogeneity)은 작은 분포값 (Low Variance)을 가짐
밝기값의 높은 유사성을 가진 픽셀그룹들의 분리 높은 유사성(high homogeneity)은 작은 분포값 (Low Variance)을 가짐 배경부와 물체부의 두 그룹이 가능한 낮은 분포값을 가지도록 임계치 t를 정해줌 - 구현: t를 0~255로 바꾸면서 값이 가장 작은 t를 찾음 : t보다 작은 픽셀그룹 확률 : 밝기 i의 히스토그램 확률 : t보다 큰 픽셀그룹 확률
44
c.f) 일반평균과 확률평균 . 일반 평균은 u = (Σ i )/n 이며, 이 때는 각 요소에 대한 weighting이 1 이고, 값을 더해준 후, 개수 n을 나누어 줌 . 확률평균의 경우 u = Σ i * p(i) 이고, 개수를 나누어줄 필요 없음. Σp(i) =1 이기 때문 * Otzu Method의 고찰 . t는 배경과 물체의 두 그룹을 나누는 역할을 함 . t가 적당하게 선택되지 않아, 배경그룹에 물체피크가 포함되면 배경을 근사해 주는 정규분포의 분산값이 커지게 됨 . 따라서 t를 배경과 물체 피크가 잘 분리되게 선택해 주어야 각각을 분산값이 작아지는 정규분포로 모델링이 가능해 짐
45
자동 이치화 t=100 M2 m1 (분산 작음) (분산 큼) 실험결과 - Optimal threshold: 100
- Group 1 Mean: Group 2 Mean: - Group 1 Variance: Group 2 Variance: 그림 6-69 Otzu방법에 의한 이치화용 임계치의 자동 결정
46
자동 이치화 입력 영상 전역이치화 적응 이치화 그림 6-72 전역이치화(Otzu법)와 적응이치화(Niblack법)비교
47
그림 6-73 자동 이치화 프로그램의 실행
48
연습문제
49
연습문제
Similar presentations