화소값 기반 처리

Download Report

Transcript 화소값 기반 처리

3장. 화소값기반처리
임은경
3장 - 화소값 기반 처리
1
영상처리 – 화소값 기반 처리
차례 및 목적

차례
 영상의
밝기 조절
 영상의 명암 대비 조절
 히스토그램
 대수 변환
 명암 변환
 룩업 테이블을 이용한 처리 속도 개선
 이진 영상 변환
 논리 연산
 CxImage 제공 함수와 비교하여 구현하기
3장 - 화소값 기반 처리
2
영상처리 – 화소값 기반 처리
들어가기전에…

화소값 기반 처리
 영상처리의
가장 중요하면서도 기초적인 작업
 영상에 있는 특정한 화소값을 기반으로 처리되는 기
법
 특징



픽셀의 원래 값이나 위치에 기반한 픽셀 값 변경
픽셀의 독립적인 처리
다른 픽셀의 영향을 받지 않음
 장점

단순하지만, 강력한 기능
3장 - 화소값 기반 처리
3
영상처리 – 화소값 기반 처리
영상의 밝기 조절


영상의 밝기 조절에 관한 개념
영상의 덧셈 처리
 상수
덧셈 처리
 두 영상간의 덧셈 처리

영상의 뺄셈 처리
 상수
뺄셈 처리
 두 영상간의 뺄셈 처리

블렌딩 처리
3장 - 화소값 기반 처리
4
영상처리 – 화소값 기반 처리
영상의 밝기 조절

영상의 밝기 조절을 어떻게 구현될까?
 명암도
영상 256레벨…
 전체적으로

밝게 만들기 위해…
어떤 특정값을 더해주자.
 고려사항
특정값을 더해주면 밝아지고 , 특정값을 빼주면 어두워진다.
 특정값을 더하고나 뺄때, 0 이하가 되거나 255이상이 되면
…?
 산술연산 처리(arithmetic operation)

3장 - 화소값 기반 처리
5
영상처리 – 화소값 기반 처리
영상의 밝기 조절

산술 연산 처리
 화소값
기반 처리 중 하나
 두가지 형태의 작업


영상의 밝기값 조절
두 영상과의 처리
 사칙연산과의


차이
사칙 연산 : +, -, *, / 만 존재함
산술 연산 : 사칙연산, 거듭제곱, 절대값 등 다양한 형태의 연
산이 존재함
3장 - 화소값 기반 처리
6
영상처리 – 화소값 기반 처리
영상의 밝기 조절

덧셈 연산자


각 픽셀에 특정값을 더해주는 처리
특징


상수 값을 더해주므로서 밝기 값이 증가함.
식


앞의 식
 화소에 다른 영상의 화소를 더해주는 경우
뒤의 식
 화소에 특정 값을 더해주는 경우
3장 - 화소값 기반 처리
7
영상처리 – 화소값 기반 처리
영상의 밝기 조절
 산술연산의
처리 예제
12
20
212
222
199
199
24
222
199
185
185
28
54
183
175
33
232
58
183
35
3장 - 화소값 기반 처리
8
영상처리 – 화소값 기반 처리
영상의 밝기 조절
 산술연산의

처리 예제
덧셈하기 ( + 50점)
12
20
212
222
62
70
262
272
199
199
24
222
249
249
74
272
249
235
235
78
+50
199
185
185
28
54
183
175
33
104
233
225
83
232
58
183
35
282
108
233
85
3장 - 화소값 기반 처리
9
영상처리 – 화소값 기반 처리
영상의 밝기 조절
 앞의
문제점…

255를 넘어가는 경우는 어떻게 처리해야 할까?

해결점
 255를 넘으면 즉 흰색보다 더 흰색이 없으므로… 최대의
흰색(255)를 할당하는 방법
 0보다 작으면 즉 검은색보다 더 검은색이 없으므로…
최저의 검은색(0)을 할당하는 방법
 255를 넘는 경우 wrapping을 시도함…
 256은 다시 0, 257은 1, 258은 2, 259는 3, 260은 4,
…
3장 - 화소값 기반 처리
10
영상처리 – 화소값 기반 처리
영상의 밝기 조절
 산술연산의

처리 예제
덧셈하기 ( + 50점)
+50
62
70
255
255
249
249
74
255
249
235
235
78
104
233
225
83
255
108
233
85
clipping
3장 - 화소값 기반 처리
11
영상처리 – 화소값 기반 처리
픽셀 단위의 산술 연산

덧셈 처리한 예제
+40
입력영상
출력 영상
255
출력 픽셀의 색상
40
0
255
입력 픽셀의 색상
255
3장 - 화소값 기반 처리
12
영상처리 – 화소값 기반 처리
영상의 밝기 조절
 산술연산의

처리 예제
덧셈하기 ( + 50점)
+50
62
70
6
16
249
249
74
16
249
235
235
78
104
233
225
83
26
108
233
85
Wrapping
3장 - 화소값 기반 처리
13
영상처리 – 화소값 기반 처리
영상의 밝기 조절
 산술연산의
처리 예제

덧셈하기 ( + 50점) + wrapping

함수의 모양
255
출력 픽셀의 색상
50
0
255
입력 픽셀의 색상
255
3장 - 화소값 기반 처리
14
영상처리 – 화소값 기반 처리
영상의 밝기 조절

결과 예제
+ 15
3장 - 화소값 기반 처리
-15
15
영상처리 – 화소값 기반 처리
영상의 밝기 조절

산술 처리 응용 분야
 영상의


상태에 따른 밝기값 조절
어두운 영상의 경우 밝게… 너무 밝은 영상은 어둡게
영상분할 후 특정 영역을 강조하기 위해 특정영역의 명암도
값을 더하거나 빼는 처리
3장 - 화소값 기반 처리
16
영상처리 – 화소값 기반 처리
영상의 밝기 조절

두 영상간의 가감 연산
 앞의
영상의 산술 연산은 상수에 대한 산술연산인데
비해, 두 개의 영상에 대해 산술 연산이 이루어짐
3장 - 화소값 기반 처리
17
영상처리 – 화소값 기반 처리
영상의 밝기 조절
두

두


영상간의 덧셈
덧셈은 두 영상의 병합과 같은 의미
영상간의 뺄셈
뺄셈은 두 영상의 차이값을 나타냄
두 개의 영상에서 차이가 큰 부분이 밝게 나타남
3장 - 화소값 기반 처리
18
영상처리 – 화소값 기반 처리
영상의 밝기 조절
 산술연산의
처리 예제(영상1)
12
20
212
222
199
199
24
222
199
185
185
28
54
183
175
33
232
58
183
35
3장 - 화소값 기반 처리
19
영상처리 – 화소값 기반 처리
영상의 밝기 조절
 산술연산의
처리 예제(영상2)
0
255
0
255
0
255
0
255
0
255
0
255
0
255
0
255
0
255
0
255
3장 - 화소값 기반 처리
20
영상처리 – 화소값 기반 처리
영상의 밝기 조절
 영상1
+ 영상2 (clipping 처리)
12
255
212
255
199
255
24
255
199
255
185
255
54
255
175
255
232
255
183
255
3장 - 화소값 기반 처리
21
영상처리 – 화소값 기반 처리
영상의 밝기 조절
 영상1
- 영상2 (clipping 처리)
12
0
212
0
199
0
24
0
199
0
185
0
54
0
175
0
232
0
183
0
3장 - 화소값 기반 처리
22
영상처리 – 화소값 기반 처리
영상의 밝기 조절

덧셈 처리한 예제


두개의 영상에 대해 덧셈 처리한 예제
특정 부분을 강조해주고자 할 경우에 사용


마스크 영상의 검은색
 값이 0이므로 다른 영상의 색상을 그대로 나타냄
마스크 영상의 흰색
 흰색으로 나타남
3장 - 화소값 기반 처리
23
영상처리 – 화소값 기반 처리
영상의 밝기 조절
 덧셈
처리한 예제
+
=
3장 - 화소값 기반 처리
24
영상처리 – 화소값 기반 처리
영상의 밝기 조절

두 영상간의 덧셈
3장 - 화소값 기반 처리
25
영상처리 – 화소값 기반 처리
영상의 밝기 조절

뺄셈 연산자


각 픽셀에 특정값을 빼주는 처리
특징


상수 값을 빼주므로서 밝기 값이 감소함.(명암도를 어둡게 함)
식


앞의 식
 화소에 다른 영상의 화소를 빼주는 경우
뒤의 식
 화소에 특정 값을 빼주는 경우
3장 - 화소값 기반 처리
26
영상처리 – 화소값 기반 처리
영상의 밝기 조절

뺄셈 처리한 예제
-40
출력 영상
입력영상
255
출력 픽셀의 색상
0
-40
3장 - 화소값 기반 처리
255
입력 픽셀의 색상
27
영상처리 – 화소값 기반 처리
영상의 밝기 조절

뺄셈 연산의 예제
3장 - 화소값 기반 처리
28
영상처리 – 화소값 기반 처리
영상의 밝기 조절
 뺄셈
연산의 예제
-
=
3장 - 화소값 기반 처리
29
영상처리 – 화소값 기반 처리
영상의 밝기 조절
 뺄셈
연산의 예제
-
=
3장 - 화소값 기반 처리
30
영상처리 – 화소값 기반 처리
영상의 밝기 조절

두 영상간의 뺄셈
3장 - 화소값 기반 처리
31
영상처리 – 화소값 기반 처리
영상의 밝기 조절

블렌딩 처리



덧셈연산의 경우 두 영상의 선형 결합(linear convolution)을 통
해 두개의 영상이 각각의 가중치에 따라 동시에 보이것이 가능함
가중치를 어떻게 주느냐에 따라 다양한 결과가 나올 수 있는데,
이를 블렌딩(blending)이라 함
블렌딩 연산자
Q( x, y)    A( x, y)  (1   )  B( x, y)
3장 - 화소값 기반 처리
32
영상처리 – 화소값 기반 처리
영상의 밝기 조절

블렌딩 처리 예제
3장 - 화소값 기반 처리
33
영상처리 – 화소값 기반 처리
영상의 밝기 조절

두영상의 블렌딩 효과
3장 - 화소값 기반 처리
34
영상처리 – 화소값 기반 처리
영상의 명암 대비 조절


영상의 명암 대비에 대한 개념
곱셈 처리
 명암

나눗셈 처리
 명암

대비를 넓게 펼쳐주는 역할
대비를 좁게 만들어주는 역할
밝기 조절과 조합
3장 - 화소값 기반 처리
35
영상처리 – 화소값 기반 처리
영상의 명암 대비 조절

명암 대비(contrast)
 영상
내의 밝은 부분과 어두운 부분이 서로 영향을 미
쳐서 상이함이 강조되어 지각되는 정도
 이 정도는 영상 내 밝거나 어두운 명암값의 분포로 평
가됨
 명암


대비의 명칭
낮은 명암 대비
 영상 내 대부분이 흐리거나 어둡거나 밝다. 즉 밝기값들
이 어느 한쪽에 치우쳐 있음
높은 명암 대비
 영상 내 어둡고, 밝은 부분이 다 포함된다. 즉 밝기값의
분포가 고르게 분포되어 있음
3장 - 화소값 기반 처리
36
영상처리 – 화소값 기반 처리
영상의 명암 대비 조절


동시 대비
 2가지 색을 동시에 보는 경우에 일어나는 대비 효과를 의
미함
계시 대비
 시간적인 차를 두고 2가지 색을 차례로 볼때의 대비 효과
를 의미함
 명암


곱셈 연산을 수행하기
밝은 부분을 더 밝게 어두운 부분을 조금 밝게 표현함
 명암


대비를 높이려면…?
대비를 낮추려면…?
나눗셈 연산을 수행하기
밝은 부분은 아주 어둡게, 어두운 부분은 조금 어둡게 표현함.
3장 - 화소값 기반 처리
37
영상처리 – 화소값 기반 처리
영상의 명암 대비 조절

곱셈 및 나눗셈 연산자



각 픽셀에 특정값을 곱해주거나 나누어주는 처리
명암 대비 조절이 가능함
특징



상수 값을 곱해주는 경우
 영상을 밝게 만들어줌
 어두운 부분은 약간 밝게만 만들고 밝은 부분은 더욱 밝게 만들
어 영상으로 보다 선명하게 만들어주는 효과
상수 값을 나누어주는 경우
 영상을 어둡게 만들어줌
 어두운 부분은 조금 어둡게 밝은 부분은 더욱 어둡게 만들어 영
상의 대비가 아주 좁아짐
식
3장 - 화소값 기반 처리
38
영상처리 – 화소값 기반 처리
영상의 명암 대비 조절

곱셈 처리한 예제
x 1.2
입력영상
출력 영상
255
출력 픽셀의 색상
0
3장 - 화소값 기반 처리
255
입력 픽셀의 색상
39
영상처리 – 화소값 기반 처리
영상의 명암 대비 조절

나눗셈 처리한 예제
/ 1.2
입력영상
출력 영상
255
출력 픽셀의 색상
0
3장 - 화소값 기반 처리
255
입력 픽셀의 색상
40
영상처리 – 화소값 기반 처리
영상의 명암 대비 조절

곱셈 나눗셈의 예제
3장 - 화소값 기반 처리
41
영상처리 – 화소값 기반 처리
영상의 명암 대비 조절

결과에 따른 히스토그램
빈
도
수
빈
도
수
0
명암값
255
명암값
0
(a) 어두운 영상
255
(b) 밝은 영상
빈
도
수
빈
도
수
0
명암값
255
(c) 낮은 명암대비 영상
명암값
0
255
(d) 높은 명암대비 영상
3장 - 화소값 기반 처리
42
영상처리 – 화소값 기반 처리
영상의 명암 대비 조절
 곱셈의
결과
3장 - 화소값 기반 처리
43
영상처리 – 화소값 기반 처리
영상의 명암 대비 조절

나눗셈의 결과
3장 - 화소값 기반 처리
44
영상처리 – 화소값 기반 처리
히스토그램



히스토그램 의 개념
히스토그램 평활화
히스토그램 스트레칭
3장 - 화소값 기반 처리
45
영상처리 – 화소값 기반 처리
히스토그램 처리

히스토그램 처리
 영상의
밝기값에 대한 분포를 보여주는 그래프
 영상분석을 위한 중요한 도구


영상의 밝기 구성
명암의 대비 등의 정보
 영상 개선 및 화질 향상을 위해 사용됨
 히스토그램


영상의 밝기값을 수평측으로 하고 수평축의 발기값에 대응되
는 크기를 가진 픽셀수가 영상 안에 몇 개나 되는지를 나타내
는 빈도수를 수직축으로 해서 만든 그래프
따라서 흑백영상의 경우 수평측은 0~255의 범위값을 가지며
, 수직축의 값은 영상의 크기와 밝기의 분포에 따라 달라짐
3장 - 화소값 기반 처리
46
영상처리 – 화소값 기반 처리
히스토그램 처리

작은 크기의 샘플영상에 대한 히스토그램
 모든
색상의 히스토그램 값을 모두 더하면 얼마인가?
3장 - 화소값 기반 처리
47
영상처리 – 화소값 기반 처리
히스토그램 처리

히스토그램 예제
3장 - 화소값 기반 처리
48
영상처리 – 화소값 기반 처리
히스토그램 처리

밝기 분포가 다른 영상의 예
3장 - 화소값 기반 처리
49
영상처리 – 화소값 기반 처리
히스토그램 처리
빈
도
수
빈
도
수
0
명암값
255
명암값
0
(a) 어두운 영상
255
(b) 밝은 영상
빈
도
수
빈
도
수
0
명암값
255
(c) 낮은 명암대비 영상
명암값
0
255
(d) 높은 명암대비 영상
3장 - 화소값 기반 처리
50
영상처리 – 화소값 기반 처리
히스토그램 용도

화질 향상
 우주공간에서

여러가지 잡영(image noise)의 영향으로 화질이 나쁨
 화질



촬영한 사진
개선용도로 히스토그램 분석법을 사용
사람이 알아보기 좋은 선명한 화질의 영상으로 변화
사람의 눈이 밝기보다는 대비에 훨씬 민감하다는 특징을 이
용
화질 개선 영상의 예제
3장 - 화소값 기반 처리
51
영상처리 – 화소값 기반 처리
히스토그램 용도

물체 인식
 공장


자동화용 영상처리
자동화 카메라를 통해 획득된 영상에서 생산공정에 놓여있는
물건의 결함을 검사하거나 형상을 인식하기 위해 사용
잔동화 카메라의 경우 조명 제어가 가능하므로 영상 이치화
를 통한 물체 분리에 사용됨
 물체인식


히스토그램의 형태를 분석하여 이치화를 수행
이치화란(image Binarization)
 픽셀의 밝기값이 0~255사이에 골고루 존재하는 영상을
영상 픽셀의 밝기값을 0 또는 255의 두 값으로 매핑하는
영상처리
3장 - 화소값 기반 처리
52
영상처리 – 화소값 기반 처리
히스토그램 용도
 영상
이치화 예제
이치화
물체 인식 결과
3장 - 화소값 기반 처리
53
영상처리 – 화소값 기반 처리
히스토그램 용도
 물체


인식
동전의 크기를 인식하여 동전을 분류하는 영상처리의 예제
이때 선결 되어야 할 작업
 동전을 배경부분과 분리하는 작업이 요구됨
 이치화를 사용
 앞의 그림은 이치화 값을 80으로 주었을때 나타난 결과
 80보다 큰 픽셀은 255로 매핑
 80보다 작은 픽셀은 0으로 매핑
 이런 이치화 값을 임계치(threshold value)라고 함
 컴퓨터 비젼에서의 연구 분야
3장 - 화소값 기반 처리
54
영상처리 – 화소값 기반 처리
히스토그램 평활화

히스토그램 평활화 (histogram equalization)
 기존
영상의 명암 값 분포를 재분배하여 일정한 분포
를 가진 히스토그램을 생성
histogram
histogram
평활화의 효과
0
255
입력 픽셀의 색상
3장 - 화소값 기반 처리
0
255
입력 픽셀의 색상
55
영상처리 – 화소값 기반 처리
히스토그램 평활화

히스토그램 평활화의 세 단계
1.
입력영상의 히스토그램 생성
- 명암값 j 의 빈도수 hist[j] 를 계산
2.
각 명암값 i 에 대하여 0부터 i 까지의 빈도수의 누적 값을 계산
i
sum[i]   hist [ j ]
j 0
3.
단계 2에서 구한 누적값을 정규화
1
n[i ]  sum[i ]   255
N
4.
( N  전체 픽셀 수)
입력영상에서 픽셀 값 i를 정규화된 값 n[i]로 변환하여
결과 영상 생성
3장 - 화소값 기반 처리
56
영상처리 – 화소값 기반 처리
히스토그램 평활화 예
원영상
히스토그램
3장 - 화소값 기반 처리
57
영상처리 – 화소값 기반 처리
히스토그램 평활화 예
평활화된
영상
히스토그램
정규화
3장 - 화소값 기반 처리
58
영상처리 – 화소값 기반 처리
히스토그램 평활화 적용 예
빈
도
수
원영상
0
명암값
255
결과 영상
3장 - 화소값 기반 처리
59
영상처리 – 화소값 기반 처리
히스토그램 평활화
영상이 어두운 영역에서 세밀한 부분을 가질
때에 효과적
3장 - 화소값 기반 처리
60
영상처리 – 화소값 기반 처리
히스토그램 평활화
3장 - 화소값 기반 처리
61
영상처리 – 화소값 기반 처리
히스토그램

히스토그램 평활화
3장 - 화소값 기반 처리
62
영상처리 – 화소값 기반 처리
히스토그램 스트레칭

히스토그램 스트레칭
 명암

대비 효과를 제공함
명암 대비란
 영상의 가장 어두운 부분과 밝은 부분의 차이를 나타냄
 명암 대비가 낮은 경우
 차이값이 크지 않아, 전체적으로 어둡거나 밝게 나타
남
 명암 대비가 높은 경우
 차이값이 크게 나타나고 전체적으로 밝기값이 골고
루 나타남
3장 - 화소값 기반 처리
63
영상처리 – 화소값 기반 처리
히스토그램 스트레칭

낮은 명암 대비


높은 명암 대비


히스토그램이 일부분에 집중
히스토그램이 두개의 큰 마루를
가짐
좋은 명암 대비


균일한 화소값 분포를 가짐
특정한 마루나 골이 부각되지 않
음
3장 - 화소값 기반 처리
64
영상처리 – 화소값 기반 처리
히스토그램 스트레칭
 히스토그램



연산의 비교
펼활화와 스트레칭
평활화 : 히스토그램을 늘리지만, 늘어나는 간격이 다름
스트레칭 : 히스토그램을 늘리기 효과, 늘어나는 간격이 같음
3장 - 화소값 기반 처리
65
영상처리 – 화소값 기반 처리
히스토그램 스트레칭


히스토그램이 모든 범위의 화소 값을 포함하도
록 영상을 확장
중앙에 집중된 히스토그램을 갖는 영상에 적합
P( x, y )  min
P ' ( x, y ) 
 255
max  min
min : 최저 화소값, max : 최고 화소값
3장 - 화소값 기반 처리
66
영상처리 – 화소값 기반 처리
히스토그램 스트레칭 예
빈
도
수
원영상
0
명암값
255
결과 영상
3장 - 화소값 기반 처리
67
영상처리 – 화소값 기반 처리
히스토그램

히스토그램 스트레칭
3장 - 화소값 기반 처리
68
영상처리 – 화소값 기반 처리
히스토그램

히스토그램 스트레칭
 스트레칭의
문제점
 해결
방법
 엔드인 탐색 스트레칭 기법이 있음

Low, high 즉 범위 값을 임의로 지정하여 명암 대비 스트레
칭을 수행함

0
x  low
 P( x, y )  low
P ' ( x, y )  
 255 low  x  high
 high  low
high  x

255
3장 - 화소값 기반 처리
69
영상처리 – 화소값 기반 처리
히스토그램

히스토그램 스트레칭(엔드인 탐색)
3장 - 화소값 기반 처리
70
영상처리 – 화소값 기반 처리
히스토그램

메모
 그외
히스토그램 관련 알고리즘
 히스토그램 수축


히스토그램 스트레칭 알고리즘과 반대 개념
범위를 지정하여 수축시킴으로서 명암 대비가 감소함
 히스토그램



단순히 히스토그램을 이동시킴
왼쪽으로 이동하면 명암도 레벨이 낮아져 어두운 영상이 생
성됨
오른쪽으로 이동하면 명암도 레벨이 높아져 밝은 영상이 생
성됨
 히스토그램

슬라이딩
명세화
원 영상에 우리가 원하는 히스토그램 데이터를 반영하면 새
로운 결과 영상을 얻게 됨
3장 - 화소값 기반 처리
71
영상처리 – 화소값 기반 처리
대수 함수 변환

로그 연산자(Logarithm Operator)
영상의 각 화소 점들에 각각 로그 변환을 취함으로써 영상의 밝기 값을
변화시키는 방법.
 각각의 화소 점에 로그 변환을 하는 이유는 인간이 빛(명암도)을 인지하
는 정도가 로그 함수를 따라 반응하는 것에 기반을 두고 있다.
 로그 변환을 수행하면 명암도가 낮은 영역은 세분화되어 표현되고 높은
영역은 조밀해져서 영상이 전체적으로 밝아지는 효과를 가져온다.

3장 - 화소값 기반 처리
72
영상처리 – 화소값 기반 처리
대수 함수 변환

로그 연산자 예제
3장 - 화소값 기반 처리
73
영상처리 – 화소값 기반 처리
대수 함수 변환

로그 연산자 예제
3장 - 화소값 기반 처리
74
영상처리 – 화소값 기반 처리
명암 변환






명암 변환에 대한 설명
널 변환
역 변환
감마 상관관계 변환
비트 플래너 슬라이싱 변환
비트 플래너 슬라이싱 변환을 이용한 워터마킹
3장 - 화소값 기반 처리
75
영상처리 – 화소값 기반 처리
명암 변환

명암 변환(Intensity transformation)
 미리
지정된 함수 f(x)를 바탕으로 이전 화소값을 새로
운 화소값으로 바꿔주는 알고리즘
 함수 f(x)가 어떻게 정의되는냐에 따라 영상의 질을 좌
우함
 함수 f(x)만 정의하면 구현은 매우 쉽다.
 x는 함수의 처리 전의 입력이고, f(x)는 처리 후의 출
력 결과를 의미함
3장 - 화소값 기반 처리
76
영상처리 – 화소값 기반 처리
명암 변환

널 변환
 f(x)
=x
 아무런 변환이 없는 형태
 원 영상과 같은 영상
 구현

Pp.269 참고
255
f(x) : 출력영상
 결과

그림 3.38
0
255
x : 입력 영상
3장 - 화소값 기반 처리
77
영상처리 – 화소값 기반 처리
명암 변환

역 변환
 Negative


연산자
가장 큰 칼라 큰 값에 영상의 포인트 값을 빼주는 연산
연산자
255
출력 픽셀의 색상
0
255
입력 픽셀의 색상
3장 - 화소값 기반 처리
78
영상처리 – 화소값 기반 처리
명암 변환

역 변환
3장 - 화소값 기반 처리
79
영상처리 – 화소값 기반 처리
명암 변환

감마 상관관계 변환
 감마
조절

컴퓨터 그래픽 분야에서 많이 사용
출력 영상의 밝기 정도를 전반적으로 조절하는 것
적절하게 조절하지 않으면 영상은 너무 밝거나 너무 어두워
모니터에 출력해도 잘 볼 수 없음
영상을 제대로 재생하려면 감마 조절이 필요함
감마 상관관계 변환 함수

명암도 영상에 적용하기 위해




 1
f ( x)  pow x, 
 r
 x 1
f ( x)  255 * pow
, 
 255.0 r 
3장 - 화소값 기반 처리
80
영상처리 – 화소값 기반 처리
명암 변환

감마 상관관계 함수
255
f(x) : 출력영상
0
255
x : 입력 영상
3장 - 화소값 기반 처리
81
영상처리 – 화소값 기반 처리
명암 변환

감마 상관관계 변환
Gamma = 1/ 0.7
3장 - 화소값 기반 처리
gamma = 1/1.7
82
영상처리 – 화소값 기반 처리
명암 변환

비트 플래너 슬라이싱 변환
 일반적으로
명암도 레벨은 0~255로 256가지 존재함
 처리시간의 부담등으로 레벨을 줄이는 것이 가능함
 2레벨, 4레벨, 8레벨, 16레벨 등이 있음
 8개의 비트값을 가지고 있어서 전체 영상은 각 비트값
으로 구성된 8개의 비트 플래인으로 구성됨
 2레벨


2개의 컬러로 표현하는 방법
총 8가지 방법이 존재함
 각 특정 비트 하나를 선정하여 그 비트가 0이냐 1이냐를
두고 검은색 및 흰색으로 mapping 하는 방법
3장 - 화소값 기반 처리
83
영상처리 – 화소값 기반 처리
명암 변환
 비트
플래너 슬라이싱 변환(0비트)
12
20
212
222
199
199
24
222
199
185
185
28
54
183
175
33
232
58
183
35
00001100
0
검은색
3장 - 화소값 기반 처리
84
영상처리 – 화소값 기반 처리
명암 변환

비트 플래너 슬라이싱 변환(7비트)
12
20
212
222
199
199
24
222
199
185
185
28
54
183
175
33
232
58
183
35
00001100
0
검은색
3장 - 화소값 기반 처리
85
영상처리 – 화소값 기반 처리
명암 변환
 4레벨


4가지 색상 이용
4가지 방법이 존재함. 7, 6비트. 5,4비트, 3,2비트. 1,0비트를
통해서 이들의 값을 00, 01, 10, 11중 어느곳에 포함되느냐
에 따라 4가지 형으로 mapping하는 방법
 8레벨


8가지 색상 이용
3개의 비트를 이용하여 8개의 그레이 컬러로 분할함
 16레벨


16개의 색상 이용
4개의 비트를 선정하여 16가지의 그레이 컬러로 분할하는 방
법
3장 - 화소값 기반 처리
86
영상처리 – 화소값 기반 처리
명암 변환

비트 플래너 슬라이싱 변환
6비트
7비트
4비트
5비트
3장 - 화소값 기반 처리
87
영상처리 – 화소값 기반 처리
이진 영상 변환

이진 영상 변환
 영상의
화소 값이 임으로 정해진 임계치(Threshold)
Th보다 작으면 화소들의 값은 검은색 값으로 바꾸고
큰 값이면 흰색으로 바꾸는 과정
 Thresholding 기법의 하나

연산자(이치화 연산과 Thresholding 연산)
1 if f ( x, y)  Th
g ( x, y)  
else
0
g ( x, y)  Ri
if Ti1  f ( x, y)  Ti , i  1,...,N

첫번째 식은 두가지 영역으로 표현되어 이치화라고 하지
만, 두번째 식은 구현에 따라 여러가지 영역으로 표현하
는 Thresholding 기법의 하나이다.
3장 - 화소값 기반 처리
88
영상처리 – 화소값 기반 처리
이진 영상 변환
 이치화와
Thresholding의 함수 표현
255
255
출력 픽셀의 색상
출력 픽셀의 색상
0
255
0
255
입력 픽셀의 색상
입력 픽셀의 색상
임계치
임계치
3장 - 화소값 기반 처리
89
영상처리 – 화소값 기반 처리
이진 영상 변환

히스토그램 정보를 이용한 물체와 배경의 분리
임계치
임계치
3장 - 화소값 기반 처리
임계치
90
영상처리 – 화소값 기반 처리
이진 영상 변환

히스토그램을 사용한 이치화

산과 계곡의 분리



동전 영상에서 물체(동전) 영역은 170의 밝기값 근방에 모여 있음
배경은 밝기값 50근처에 모여 있음
이들을 분리하기 위해 적절한 임계치는 100임
적절한 임계치
3장 - 화소값 기반 처리
91
영상처리 – 화소값 기반 처리
이진 영상 변환

이진 변환(단일 경계값)
1 if f ( x, y)  Threshold
g ( x, y)  
else
0
255
출력 픽셀의 색상
0
255
입력 픽셀의 색상
임계치
3장 - 화소값 기반 처리
92
영상처리 – 화소값 기반 처리
이진 영상 변환

이진 변환 (threshold value : 128 (중간값))
3장 - 화소값 기반 처리
93
영상처리 – 화소값 기반 처리
이진 영상 변환

이진 변환(이중 경계값)
1 if low  f ( x, y)  high
g ( x, y)  
else
0
255
출력 픽셀의 색상
0
255
입력 픽셀의 색상
임계치(low)
3장 - 화소값 기반 처리
임계치(high)
94
영상처리 – 화소값 기반 처리
이진 영상 변환

이진 변환(이중 경계값)
3장 - 화소값 기반 처리
95
영상처리 – 화소값 기반 처리
이진 영상 변환

이진 변환 (히스토그램 분포 이용)
경계값
otsu 알고리즘
(분산 최대법 알고리즘)
: 히스토그램을 어떤 경계값으로써 2개 나누었을 경우, 각 영역 사이의 분산이
최대로 되도록 경계값을 정하는 것
3장 - 화소값 기반 처리
96
영상처리 – 화소값 기반 처리
이진 영상 변환

이진 변환 (히스토그램 분포 이용) 경계값 : 77
3장 - 화소값 기반 처리
97
영상처리 – 화소값 기반 처리
이진 영상 변환

이진 변환 (보간적 경계값 설정 방법)
 히스토그램으로
모든 화소값의 평균값 계산
 평균값보다 더 낮은 화소들의 평균값 구하기
 평균값보다 더 높은 화소들의 평균값 구하기
3장 - 화소값 기반 처리
98
영상처리 – 화소값 기반 처리
이진 영상 변환

이진 변환 (보간적 경계값 설정 방법)
3장 - 화소값 기반 처리
99
영상처리 – 화소값 기반 처리
논리 변환

논리 연산자




산술 연산자와 마찬 가지로 영상간의 비트 연산처리 역시 가능
산술 연산자가 그레이레벨(gray-Level) 영상이나 칼라영상에서 사용
될 수 있었던 반면, 0과 1만을 처리할 수 있는 논리 연산자는 일반적
으로 바이너리 영상간에만 사용
논리 연산자에는 AND, OR, XOR, NOT 연산자
논리 변환의 용도
두
영상간의 상관 관계를 기반으로 객체 존재 파악, 특징
추출 등에 사용됨
3장 - 화소값 기반 처리
100
영상처리 – 화소값 기반 처리
논리 변환
 논리
연산자
3장 - 화소값 기반 처리
101
영상처리 – 화소값 기반 처리
논리 변환

논리 연산자의 예제
3장 - 화소값 기반 처리
102
영상처리 – 화소값 기반 처리
논리 변환

논리 연산자 예제
3장 - 화소값 기반 처리
103
영상처리 – 화소값 기반 처리
구현하기

밝기 조절 (상수 덧셈 연산)
 덧셈
연산
 클리핑 함수
 두 영상간의 덧셈
 상수 뺄셈 연산
 두 영상간의 뺄셈
 블렌딩 처리(두영상간의 덧셈)

명암 대비 조절
 곱셈
연산
 나눗셈 연산
3장 - 화소값 기반 처리
104
영상처리 – 화소값 기반 처리
구현하기

히스토그램을 이용한 명암 대비 조절
 히스토그램
그리기
 히스토그램 평활화
 히스토그램 스트레칭

함수를 이용한 픽셀 처리
 대수
함수(로그 함수)
 널 함수
 역 함수
 감마 함수
 비트 플레인 처리

2레벨, 4레벨, 8레벨, 16레벨
3장 - 화소값 기반 처리
105
영상처리 – 화소값 기반 처리
구현하기

이진 영상 변환
 단일
경계값을 이용
 이중 경계값을 이용
 히스토그램을 이용
 보간적 경계값 설정을 이용

논리 연산
 이진
영상에서의 논리 연산
 명암도 영상에서의 논리 연산
3장 - 화소값 기반 처리
106
영상처리 – 화소값 기반 처리
BYTE** CPixel::GS_add_constant( BYTE** gray_image, int height, int
width, int constant){
int i, j;
BYTE **result_image;
if( constant < -255 || constant > 255 )
{
GS_errMsg("constant의 범위는 -255 ~ 255입니다.");
return NULL;
}
CColor cColor;
result_image = cColor.GS_alloc2D( height, width );
for(i=0; i<height; i++)
{
for(j=0; j<width; j++)
{
result_image[i][j] = GS_clamping(gray_image[i][j] + constant);
}
}
return result_image;
}
차례로…
3장 - 화소값 기반 처리
107
영상처리 – 화소값 기반 처리
BYTE CPixel::GS_clamping(int var, int method){
int retVal = 0;
if( method < 0 || method > 1 ){
GS_errMsg("method 값의 범위를 넘어, 0으로 설정합니다.");
method = 0;
}
switch(method)
{
case 0 : // saturation
if( var > 255 ) retVal = (BYTE)255;
else if( var < 0 ) retVal = (BYTE)0;
else retVal = (BYTE)var;
break;
case 1 : // wrap
if( var > 255 ) retVal = (BYTE)(var % 256);
else if( var < 0 ) retVal = (BYTE)0;
else retVal = (BYTE)var;
break;
}
return retVal;
차례로…
108
3장 - 화소값 기반 처리
}
영상처리 – 화소값 기반 처리
// 두 영상간 덧셈을 한다.
BYTE **CPixel::GS_add_image(BYTE **gray_image1, BYTE
**gray_image2, int height, int width){
int i, j;
CColor cColor;
BYTE **result_image;
result_image = cColor.GS_alloc2D( height, width );
for(i=0; i<height; i++)
{
for(j=0; j<width; j++)
{
result_image[i][j] = GS_clamping(gray_image1[i][j] +
gray_image2[i][j]);
}
}
return result_image;
차례로…
}
3장 - 화소값 기반 처리
109
영상처리 – 화소값 기반 처리
BYTE** CPixel::GS_subtract_constant( BYTE** gray_image, int height,
int width, int constant){
int i, j;
BYTE **result_image;
if( constant < -255 || constant > 255 )
{
GS_errMsg("constant의 범위는 -255 ~ 255입니다.");
return NULL;
}
CColor cColor;
result_image = cColor.GS_alloc2D( height, width );
for(i=0; i<height; i++)
{
for(j=0; j<width; j++)
{
result_image[i][j] = GS_clamping(gray_image[i][j] - constant);
}
}
return result_image;
}
차례로…
3장 - 화소값 기반 처리
110
영상처리 – 화소값 기반 처리
/ 두 영상간 뺄셈을 한다.
BYTE **CPixel::GS_subtract_image(BYTE **gray_image1, BYTE
**gray_image2, int height, int width){
int i, j;
CColor cColor;
BYTE **result_image;
result_image = cColor.GS_alloc2D( height, width );
for(i=0; i<height; i++)
{
for(j=0; j<width; j++)
{
result_image[i][j] = GS_clamping(gray_image1[i][j] gray_image2[i][j]);
}
}
return result_image;
}
차례로…
3장 - 화소값 기반 처리
111
영상처리 – 화소값 기반 처리
BYTE **CPixel::GS_blending_effect(BYTE **gray_image1, BYTE
**gray_image2, int height, int width, double alpha){
int i, j;
double var;
CColor cColor;
BYTE **result_image;
result_image = cColor.GS_alloc2D( height, width );
for(i=0; i<height; i++)
{
for(j=0; j<width; j++) {
var = alpha*(double)gray_image1[i][j] +
(1.0 - alpha)*(double)gray_image2[i][j];
result_image[i][j] = GS_clamping(var);
}
}
return result_image;
}
차례로…
3장 - 화소값 기반 처리
112
영상처리 – 화소값 기반 처리
// 영상에 상수를 곱한다.
BYTE **CPixel::GS_multiple_constant( BYTE** gray_image, int height,
int width, double constant){
int i, j;
BYTE **result_image; CColor cColor;
if( constant < 0.0 || constant > 255.0 )
{
GS_errMsg("constant의 범위는 0.0 ~ 255.0 입니다.");
return NULL;
}
result_image = cColor.GS_alloc2D( height, width );
for(i=0; i<height; i++){
for(j=0; j<width; j++)
{
result_image[i][j] = GS_clamping(gray_image[i][j] * constant);
}
}
return result_image;
}
차례로…
3장 - 화소값 기반 처리
113
영상처리 – 화소값 기반 처리
// 영상을 상수로 나눈다.
BYTE **CPixel::GS_divide_constant( BYTE** gray_image, int height, int
width, double constant){
int i, j;
BYTE **result_image; CColor cColor;
if( constant == 0.0 ) {
GS_errMsg("0으로 나눌 수는 없습니다.");
return NULL; }
if( constant < 0.0 || constant > 255.0 )
{
GS_errMsg("constant의 범위는 0.0 ~ 255.0 입니다.");
return NULL; }
result_image = cColor.GS_alloc2D( height, width );
for(i=0; i<height; i++){
for(j=0; j<width; j++)
{
result_image[i][j] = GS_clamping(gray_image[i][j] / constant);
}
}
return result_image;
차례로…
114
3장 - 화소값 기반 처리
}
영상처리 – 화소값 기반 처리
// 명암도 영상의 histogram을 생성한다.
BYTE **CHist::GS_imhist( int *hist_image_height,int *hist_image_width,
BYTE **gray_image, int height, int width, int max_length ){
int i, j;
int pixel;
int tmp_hist_height;
// 히스토그램 영상의 높이, 너비를 설정한다.
int hist_height = 128;
int hist_width = 256;
// 히스토그램 영상에서 배경색을 지정한다.
BYTE background_level = 192;
// 256개의 방을 갖는 히스토그램을 초기화한다.
int *histData = (int *)calloc( 256, sizeof(int) );
// 히스토그램을 구한다.
for(i=0; i<height; i++)
{
for(j=0; j<width; j++) {
// 해당 화소값에 대한 빈도수를 증가시킨다.
pixel = (int)gray_image[i][j];
histData[ pixel ]++;
}
차례로…
115
3장 - 화소값 기반 처리
}
영상처리 – 화소값 기반 처리
// 히스토그램에서 최대 빈도수를 찾는다.
if( max_length == 0) {
tmp_hist_height = max_length;
for(i=0; i<256; i++){
tmp_hist_height = __max( histData[i], tmp_hist_height );
}
}
else {
tmp_hist_height = max_length;
}
int hist_bar_height = 20;
// 명암도 띠의 높이를 설정
CColor cColor;
// 히스토그램 영상에 대한 메모리 할당
BYTE **tmp_hist_image1 = cColor.GS_alloc2D( tmp_hist_height, hist_width );
BYTE **tmp_hist_image2 = cColor.GS_alloc2D( tmp_hist_height, hist_width );
BYTE **hist_image = cColor.GS_alloc2D( hist_height + hist_bar_height,
hist_width );
차례로…
3장 - 화소값 기반 처리
116
영상처리 – 화소값 기반 처리
// STEP 1 : 히스토그램 영상을 생성한다.
int tmp = 0;
for(i=0; i<hist_width; i++) {
tmp = histData[i];
if( tmp == 0 || tmp > tmp_hist_height ) continue;
for( j=tmp-1; j>=0; j--){
tmp_hist_image1[j][i] = (BYTE)255; // 흰색
}
}
// STEP 2 : 배경색을 교체한다.
for(i=0; i<tmp_hist_height; i++){
for(j=0; j<hist_width; j++){
tmp_hist_image2[i][j] = tmp_hist_image1[i][j];
if( tmp_hist_image2[i][j] == 255 )
tmp_hist_image2[i][j] = (BYTE)0;
else
tmp_hist_image2[i][j] = background_level;
차례로…
}
3장 - 화소값 기반 처리
117
영상처리 – 화소값 기반 처리
// STEP 3 : 이웃화소 보간법을 이용하여 128 x 256에 맞게 축소한다.
BYTE **tmp_hist_image3 = GS_nearInterp(hist_height, hist_width,
tmp_hist_image2, tmp_hist_height, hist_width);
// STEP 4 : histogram bar를 삽입한다.
for(i=0; i<hist_height + hist_bar_height; i++){
for(j=0; j<hist_width; j++){
// histogram bar
if( i < hist_bar_height )
{
hist_image[i][j] = (BYTE)j;
}
else{
hist_image[i][j] = tmp_hist_image3[ i-hist_bar_height ][j];
}
}
}
*hist_image_height = hist_height + hist_bar_height;
차례로…
*hist_image_width = hist_width;
3장 - 화소값 기반 처리
118
영상처리 – 화소값 기반 처리
// 메모리 해제
free( histData );
cColor.GS_free2D( tmp_hist_image1, tmp_hist_height );
cColor.GS_free2D( tmp_hist_image2, tmp_hist_height );
cColor.GS_free2D( tmp_hist_image3, hist_height );
return hist_image;
}
차례로…
3장 - 화소값 기반 처리
119
영상처리 – 화소값 기반 처리
// 히스토그램 평활화
BYTE **CHist::GS_imhisteq( BYTE **gray_image, int height, int width ){
int i, j;
double var;
int pixel;
int image_length = height * width; int gray_level = 256;
CColor cColor;
BYTE **histeq_image = cColor.GS_alloc2D(height, width);
// 256개의 방을 갖는 히스토그램을 초기화한다.
int *histData = (int *)calloc( gray_level, sizeof(int) );
// 히스토그램 누적합
int *hist_bin_acc = (int *)calloc( gray_level, sizeof(int) );
// 정규화 누적합
double *hist_normal_sum = (double *)calloc( gray_level,
sizeof(double) );
차례로…
3장 - 화소값 기반 처리
120
영상처리 – 화소값 기반 처리
// 히스토그램을 구한다.
for(i=0; i<height; i++){
for(j=0; j<width; j++) {
pixel = (int)gray_image[i][j];
histData[ pixel ]++; // 해당 화소값에 대한 빈도수를 증가
}
}
// 누적 빈도수를 계산한다.
for(i=0; i<gray_level; i++)
{
// 첫 인덱스 부분은 누적합 시키지 않는다.
if( i == 0)
hist_bin_acc[0] = histData[0];
else
hist_bin_acc[i] = hist_bin_acc[i-1] + histData[i];
}
// 정규화한 누적합을 계산한다.
for(i=0; i<gray_level; i++) {
var = ((double)hist_bin_acc[i]/(double)image_length) * (gray_level
- 1.0);
차례로…
hist_normal_sum[i] = var;
3장 - 화소값 기반 처리
121
영상처리 – 화소값 기반 처리
// 히스토그램 평활화 과정을 거쳐 새로운 영상을 얻는다.
for(i=0; i<height; i++)
{
for(j=0; j<width; j++) {
pixel = (int)gray_image[i][j];
histeq_image[i][j] = (BYTE)hist_normal_sum[ pixel ];
}
}
// 메모리 해제
free(histData);
free(hist_bin_acc);
free(hist_normal_sum);
return histeq_image;
}
차례로…
3장 - 화소값 기반 처리
122
영상처리 – 화소값 기반 처리
// 히스토그램 스트레칭
BYTE **CHist::GS_imhist_streching( BYTE **gray_image, int height, int
width ){
int i, j;
int smallest_index = 0;
// 최소 빈도수를 가진 인덱스
int largest_index = 0;
// 최대 빈도스를 가진 인댁스
int max_level = 255; // 명암도 영상의 최고 레벨(in 8-bit)
int gray_level = 256;// 명암도 영상 레벨
int pixel;
int tmp1;
double tmp2;
CColor cColor;
CPixel cPixel;
// 히스토그램 스트레칭 수행 결과를 담을 영상
BYTE **hist_streching_image = cColor.GS_alloc2D(height, width);
// 256개의 방을 갖는 히스토그램을 초기화한다.
int *histData = (int *)calloc( gray_level, sizeof(int) );
int *newHistData = (int *)calloc( gray_level, sizeof(int) );
차례로…
3장 - 화소값 기반 처리
123
영상처리 – 화소값 기반 처리
// 히스토그램을 구한다.
for(i=0; i<height; i++)
{
for(j=0; j<width; j++)
{
// 해당 화소값에 대한 빈도수를 증가시킨다.
pixel = (int)gray_image[i][j];
histData[ pixel ]++;
}
}
// 왼쪽에서 존재하는 index를 찾는다.
for(i=0; i<gray_level; i++) {
tmp1 = histData[i];
if( tmp1 != 0 ) {
smallest_index = i;
break;
}
}
차례로…
3장 - 화소값 기반 처리
124
영상처리 – 화소값 기반 처리
// 오른쪽에서 존재하는 index를 찾는다.
for(i=gray_level-1; i>=0; i--){
tmp1 = histData[i];
if( tmp1 != 0 ){
largest_index = i;
break;
}
}
// 새로운 히스토그램을 생성한다.
for(i=0; i<gray_level; i++){
tmp2 = (double)(i-smallest_index)/(double)(largest_indexsmallest_index);
newHistData[i] = (int)(tmp2*max_level);
}
차례로…
3장 - 화소값 기반 처리
125
영상처리 – 화소값 기반 처리
// 히스토그램 스트레칭 결과를 영상에 담는다.
for(i=0; i<height; i++){
for(j=0; j<width; j++) {
tmp1 = (int)gray_image[i][j];
hist_streching_image[i][j] = cPixel.GS_clamping(
newHistData[tmp1] );
}
}
// 메모리 해제
free(histData);
free(newHistData);
return hist_streching_image;
}
차례로…
3장 - 화소값 기반 처리
126
영상처리 – 화소값 기반 처리
// 명암도 영상에 대해 대수함수를 수행한다.
BYTE **CPixel::GS_logarithm( BYTE **gray_image, int height, int width
){
int i, j;
int max_var = -1;
BYTE **result_image;
CColor cColor;
result_image = cColor.GS_alloc2D( height, width );
for(i=0; i<height; i++)
{
for(j=0; j<width; j++)
{
if( max_var < (int)gray_image[i][j] ) {
max_var = (int)gray_image[i][j];
}
}
}
// 배율상수
double constant = 255.0 / log(1+max_var);
double pixel;
차례로…
3장 - 화소값 기반 처리
127
영상처리 – 화소값 기반 처리
for(i=0; i<height; i++)
{
for(j=0; j<width; j++)
{
pixel = constant * log( 1.0 + (int)gray_image[i][j] );
result_image[i][j] = (int)pixel;
}
}
return result_image;
}
차례로…
3장 - 화소값 기반 처리
128
영상처리 – 화소값 기반 처리
// 명암도 영상에 대해 널 변환한다.
BYTE **CPixel::GS_null_trans( BYTE **gray_image, int height, int width )
{
int i, j;
CColor cColor;
BYTE **result_image = cColor.GS_alloc2D( height, width );
for(i=0; i<height; i++)
{
for(j=0; j<width; j++)
{
result_image[i][j] = gray_image[i][j];
}
}
return result_image;
}
차례로…
3장 - 화소값 기반 처리
129
영상처리 – 화소값 기반 처리
// 명암도 영상에 대해 역 변환한다.
BYTE **CPixel::GS_inverse_trans( BYTE **gray_image, int height, int
width )
{
int i, j;
CColor cColor;
BYTE **result_image = cColor.GS_alloc2D( height, width );
for(i=0; i<height; i++)
{
for(j=0; j<width; j++)
{
result_image[i][j] = 255 - gray_image[i][j];
}
}
return result_image;
}
차례로…
3장 - 화소값 기반 처리
130
영상처리 – 화소값 기반 처리
// 명암도 영상에 대해 감마 상관관계 변환한다.
BYTE **CPixel::GS_gamma_trans( BYTE **gray_image, int height, int
width, double r ){
int i, j;
double var;
double gamma;
CColor cColor;
BYTE **result_image = cColor.GS_alloc2D( height, width );
for(i=0; i<height; i++)
{
for(j=0; j<width; j++) {
gamma = 1.0/r;
var = 255.0 * pow( (gray_image[i][j]/255.0), gamma );
result_image[i][j] = GS_clamping( var );
}
}
return result_image;
}
차례로…
3장 - 화소값 기반 처리
131
영상처리 – 화소값 기반 처리
// 비트 플래너 슬라이싱 변환, 1 bit만 추출(2 level 영상)
BYTE **CPixel::GS_1bit_planar_slicing(BYTE **gray_image, int height,
int width, int nbit){
int i, j;
int var;
CColor cColor;
BYTE **result_image = cColor.GS_alloc2D( height, width );
if( nbit < 0 || nbit > 7 )
{
GS_errMsg("nbit의 범위는 1 ~ 7 입니다.");
return NULL;
}
for(i=0; i<height; i++)
{
for(j=0; j<width; j++)
{
var = (int)gray_image[i][j];
if( nbit == 4 ) var = ((var & 0x10) >> 4)*255;
else if( nbit == 5 ) var = ((var & 0x20) >> 5)*255;
else if( nbit == 6 ) var = ((var & 0x40) >> 6)*255;
else if( nbit == 7 ) var = ((var & 0x80) >> 7)*255;
차례로…
3장 - 화소값 기반 처리
132
영상처리 – 화소값 기반 처리
result_image[i][j] = (BYTE)var;
}
}
return result_image;
}
차례로…
3장 - 화소값 기반 처리
133
영상처리 – 화소값 기반 처리
// 비트 플래너 슬라이싱 변환, 2 bit만 추출(4 level 영상)
BYTE **CPixel::GS_2bit_planar_slicing(BYTE **gray_image, int height,
int width){
int i, j;
int var;
CColor cColor;
BYTE **result_image = cColor.GS_alloc2D( height, width );
for(i=0; i<height; i++)
{
for(j=0; j<width; j++)
{
var = (((int)gray_image[i][j] & 0xC0) >> 6)*255/3;
result_image[i][j] = (BYTE)var;
}
}
return result_image;
}
차례로…
3장 - 화소값 기반 처리
134
영상처리 – 화소값 기반 처리
// 비트 플래너 슬라이싱 변환, 8 bit만 추출(16 level 영상)
BYTE **CPixel::GS_4bit_planar_slicing(BYTE **gray_image, int height,
int width){
int i, j;
int var;
CColor cColor;
BYTE **result_image = cColor.GS_alloc2D( height, width );
for(i=0; i<height; i++)
{
for(j=0; j<width; j++)
{
var = (((int)gray_image[i][j] & 0xF0) >> 4)*255/15;
result_image[i][j] = (BYTE)var;
}
}
return result_image;
}
차례로…
3장 - 화소값 기반 처리
135
영상처리 – 화소값 기반 처리
// 단일 경계값을 이용한 이진 영상 변환
BYTE **CPixel::GS_gray2binary_unity( BYTE **gray_image, int height,
int width, int threshold ){
int i, j;
BYTE **result_image;
double pixel;
CColor cColor;
result_image = cColor.GS_alloc2D( height, width );
// 이진 영상 변환을 위한 LUT 생성
double *LUT = (double *)calloc(256, sizeof(double));
for(i=0; i<256; i++)
{
if( i > threshold ) LUT[i] = 1;
else LUT[i] = 0;
}
차례로…
3장 - 화소값 기반 처리
136
영상처리 – 화소값 기반 처리
for(i=0; i<height; i++){
for(j=0; j<width; j++)
{
pixel = LUT[ (int)gray_image[i][j] ];
result_image[i][j] = (BYTE)pixel;
}
}
free(LUT);
return result_image;
}
차례로…
3장 - 화소값 기반 처리
137
영상처리 – 화소값 기반 처리
// 이중 경계값을 이용한 이진 영상 변환
BYTE **CPixel::GS_gray2binary_dual( BYTE **gray_image, int height,
int width, int low_threshold, int high_threshold ){
int i, j;
BYTE **result_image; double pixel;
// 메모리 할당
CColor cColor;
result_image = cColor.GS_alloc2D( height, width );
// 이진 영상 변환을 위한 LUT 생성
double *LUT = (double *)calloc(256, sizeof(double));
for(i=0; i<256; i++) {
if( i >= low_threshold && i <= high_threshold ){
LUT[i] = 1;
}
else { LUT[i] = 0; }
}
차례로…
3장 - 화소값 기반 처리
138
영상처리 – 화소값 기반 처리
for(i=0; i<height; i++)
{
for(j=0; j<width; j++)
{
pixel = LUT[ (int)gray_image[i][j] ];
result_image[i][j] = (BYTE)pixel;
}
}
free(LUT);
return result_image;
}
3장 - 화소값 기반 처리
139
영상처리 – 화소값 기반 처리
// 히스토그램의 분포를 이용한 이진 영상 변환
BYTE **CPixel::GS_gray2binary_otsu( BYTE **gray_image, int
height, int width, int *otsu_threshold ){
int i, j;
int pixel;
// 히스토그램을 구한다.
int *histData = (int *)calloc( 256, sizeof(int) );
double *histPData = (double *)calloc( 256, sizeof(double) );
double *histCData = (double *)calloc( 256, sizeof(double) );
// 히스토그램을 구한다.
for(i=0; i<height; i++)
{
for(j=0; j<width; j++)
{
// 해당 화소값에 대한 빈도수를 증가시킨다.
pixel = (int)gray_image[i][j];
histData[ pixel ]++;
}
}
double sum = 0.0;
차례로…
3장 - 화소값 기반 처리
140
영상처리 – 화소값 기반 처리
for(i=0; i<256; i++) sum += (histData[i]);
for(i=0; i<256; i++) histPData[i] = (double)(histData[i])/sum;
for(i=0; i<256; i++) {
for(j=0; j<=i; j++) {
histCData[i] += histPData[j];
}
}
double *f = (double *)calloc( 256, sizeof(double) );
for(i=0; i<256; i++) {
for(j=0; j<=i; j++) {
f[i] += j * histPData[j];
}
}
double F = f[255];
double t = 0.0;
double *sigma = (double *)calloc( 256, sizeof(double) );
차례로…
3장 - 화소값 기반 처리
141
영상처리 – 화소값 기반 처리
for(i=0; i<256; i++) {
t = histCData[i] - histCData[i]*histCData[i];
if(t == 0) t = 0.000001;
sigma[i] = ((F*histCData[i] - f[i]) * (F * histCData[i] - f[i])) / t;
}
double maxSigma = -99999999.0; int threshold = -1;
for(i=0; i<256; i++){
if( sigma[i] > maxSigma ) {
threshold = i;
maxSigma = sigma[i];
}
}
*otsu_threshold = threshold;
// 메모리 해제
free(histData); free(histPData); free(histCData);
free(f); free(sigma);
return GS_gray2binary_unity(gray_image, height, width, threshold);
3장 - 화소값 기반 처리
142
영상처리 – 화소값 기반 처리
// 보간적 경계값 설정을 이용한 이진 영상 변환
BYTE **CPixel::GS_gray2binary_iterate( BYTE **gray_image, int
height, int width, int *iterate_threshold ){
int i, j;
int pixel;
double hist_sum = 0.0;
double hist_old_mean = 0.0;
double hist_mean = 0.0;
double low_sum;
double high_sum;
int
low_count;
int high_count;
int threshold;
int *histData = (int *)calloc( 256, sizeof(int) );
double *histPData = (double *)calloc( 256, sizeof(double) );
double *histCData = (double *)calloc( 256, sizeof(double) );
// 히스토그램을 구한다.
for(i=0; i<height; i++){
for(j=0; j<width; j++) {
pixel = (int)gray_image[i][j];
histData[ pixel ]++;
}
차례로…
143
3장 - 화소값 기반 처리
}
영상처리 – 화소값 기반 처리
for(i=0; i<256; i++) hist_sum += (histData[i]*i);
//히스토그램 합
hist_old_mean = hist_sum/(double)(height*width); // 히스토그램 평균
// 반복적으로 평균값을 계산한다.
do {
hist_mean = hist_old_mean;
// 초기화
low_sum = 0.0; high_sum = 0.0; low_count = 0; high_count = 0;
for (i=0; i<256; i++){
if( (double)i <= hist_old_mean ){
low_sum += histData[i]*i;
low_count += histData[i];
}
else{
high_sum += histData[i]*i;
high_count += histData[i];
}
차례로…
}
3장 - 화소값 기반 처리
144
영상처리 – 화소값 기반 처리
hist_old_mean = ( (low_sum/(double)low_count) +
(high_sum/(double)high_count) )/2.0;
} while(hist_old_mean != hist_mean);
threshold = (int)hist_old_mean;
*iterate_threshold = threshold;
// 메모리 해제
free(histData);
return GS_gray2binary_unity(gray_image, height, width, threshold);
}
차례로…
3장 - 화소값 기반 처리
145
영상처리 – 화소값 기반 처리
// 이진 영상에서의 논리 연산 - 논리 연산자(logical operator) 사용
BYTE **CPixel::GS_binary_logic( BYTE **binary_image1, BYTE
**binary_image2, int height, int width, int method ){
int i, j;
BYTE **result_image; BYTE var, var1, var2;
CColor cColor;
result_image = cColor.GS_alloc2D( height, width );
for(i=0; i<height; i++){
for(j=0; j<width; j++){
var1 = (binary_image1[i][j] == 0 ? 1 : 0);
var2 = (binary_image2[i][j] == 0 ? 1 : 0);
switch(method){
case 0 :
// AND
var = (var1 && var2);
break;
case 1 :
// NAND
var = !(var1 && var2);
break;
차례로…
3장 - 화소값 기반 처리
146
영상처리 – 화소값 기반 처리
case 2 :
case 3 :
case 4 :
case 5 :
// OR
var = (var1 || var2);
break;
// NOR
var = !(var1 || var2);
break;
// XOR
var = (var1 != var2 ? 1 : 0);
break;
// XNOR
var = (var1 == var2 ? 1 : 0);
break;
}
result_image[i][j] = (var == 0 ? 1 : 0);
} // end for
} // end for
return result_image;
3장 - 화소값 기반 처리
차례로…
147
영상처리 – 화소값 기반 처리
// 명암도 영상에서의 논리 연산 - 비트 연산자(bitwise operator) 사용
BYTE **CPixel::GS_gray_logic( BYTE **gray_image1, BYTE
**gray_image2, int height, int width, int method ){
int i, j;
BYTE **result_image; int var, var1, var2;
CColor cColor;
result_image = cColor.GS_alloc2D( height, width );
for(i=0; i<height; i++){
for(j=0; j<width; j++) {
var1 = (int)gray_image1[i][j];
var2 = (int)gray_image2[i][j];
switch(method){
case 0 :
// AND
var = (var1 & var2);
break;
case 1 :
// NAND
var = ~(var1 & var2);
break;
차례로…
3장 - 화소값 기반 처리
148
영상처리 – 화소값 기반 처리
case 2 :
case 3 :
case 4 :
case 5 :
// OR
var = (var1 | var2);
break;
// NOR
var = ~(var1 | var2);
break;
// XOR
var = var1 ^ var2;
break;
// Difference
var = var & (~var2);
break;
} // end switch
result_image[i][j] = (BYTE)var;
} // end for
} // end for
return result_image;
}
3장 - 화소값 기반 처리
차례로…
149
영상처리 – 화소값 기반 처리
레포트 -3
제공된 클래스를 이용하여 구현하기
 제공된


클래스
HIST.CPP, HIST.H
PIXEL.CPP, PIXEL.H
 제공된
클래스를 이용하여 3장의 메뉴를 만들고 다음
의 처리를 메뉴에 추가하여 구현해보라.






명암 밝기 – 상수 덧셈, 상수 뺄셈
명암 대비 – 상수 곱셈, 상수 나눗셈
히스토그램 – 히스토그램 보기, 히스토그램 평활화, 히스토그
램 스트레칭
명암 변환 함수 – 로그 함수, 널 함수, 역 함수, 감마 함수, 비
트 플레인(2레벨, 8레벨, 16레벨)
이진 변환 – 단일 경계값, 이진 경계값, 히스토그램 방법
논리 함수 - 명암도 논리 연산
3장 - 화소값 기반 처리
150
영상처리 – 화소값 기반 처리
레포트 -3 제출일

이주 후 수업 전날 밤 12시까지
 제출시
주의 사항

제목 : 레포트3_자신의학과학번이름
이름 : 자신의 이름
파일 첨부를 통해서 올려주세요.

파일 명 : 레포트3_자신의학과학번이름.ZIP


3장 - 화소값 기반 처리
151