히스토그램

컴퓨터비전/영상처리 2014. 10. 9. 16:18

히스토그램이란?

영상에서 [0, L-1] 사이의 명암 값이 각각 영상에 몇 번 나타나는지 표시하는것을 말한다.

히스토그램 계산은 다음과 같은 방법으로 구할 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
/*
입력 : 명암 영상 f(j, i), 0≤j≤M-1, 0≤i≤N-1
출력 : 히스토그램 h(I)와 정규 히스토그램 H(I), 0≤I≤L-1
*/
for(I=0 to L-1) 
   h(l) = 0; // 초기화
 
for(j=0 to M-1)
   for(i=0 to N-1) // f의 화소 (j, i) 각각에 대한 처리
      h(f(j, i))++; // 명암 값에 해당하는 히스토그램 칸을 1만큼 증가
 
for(I=0 to L-1)
   H(I) = h(I)/(MxN); // 정규화

5행은 모든 명암값의 히스토그램 h(x) 를 0으로 초기화 한다.

8~10행은 모든 화소에 접근하여 명암값에 해당하는 히스토그램 칸(bin)을 1만큼 증가시킨다.

12~13행은 모두 더하면 1.0 이 되도록 h(x)를 정규화 한다.


다음과 같은 식으로 표현 가능하다. (h = 히스토그램, H = 정규화 히스토그램)


명암 영상에서의 히스토그램 계산 예)

M과 N이 8이고 L = 8인 아주 작은 영상이다. 이 영상에서 명암값인 2인 화소는 13개 이므로 h(2) = 13이다.

다른 명암값에 대해서도 화소의 개수를 세어보면 h=(0,0,13,18,19,10,4,0)이고, 

H(I) = (0, 0, 0.203, 0.281, 0.297, 0.156, 0.063, 0)이다.

이것을 그래프로 그리면 다음 그림과 같다.


                 [그림1 - 2차원 배열 히스토그램 표현]


히스토그램은 어디서 사용할까? 여러 용도중 하나는 영상의 특성을 파악하는 것이다.

아래 그림을 보게 되면 히스토그램을 보고 그림의 특성을 파악할수 있다.

첫번째 그림은 히스토그램의 명암값이 낮은 값에 주로 위치하고 있다. 따라서 영상은 어두운 영상이다.

두번째 그림은 영상의 명암값이 골고루 푼보되어있다. 

세번째 그림은 어두운 부분과 밝은 부분 2가지로 되어있다.


                   [그림2 - 영상 명암에 따른 히스토그램 분포도]


히스토그램의 또 다른 용도는 조작을 통한 영상 품질 개선이다.

가장 대표적인 연산은 히스토그램 평활화(Histogram equalization)이다.

이 연산은 히스토그램을 균등하게 분포시킨다.

이렇게 하면 영상이 사용하는 명암의 범위, 즉 동적 범위가 늘어나 영상이 이전보다 선명해진다.



위 식은 입력영상 f를 평활화하여 출력 영상g 를 만드는 데 사용하는 변환 식이다.

여기에서 c()는 누적 히스토그램이고, round()는 반올림 연산이다.

T()는 입력영상 f의 명암 값 I(in)을 출력영상 g의 명암값I(out)으로 변환하는 매핑 함수이다.

이 매핑 함수는 누적 히스토그램에 (L-1)을 곱하고 결과를 반올림하면 된다.


출력영상 g를 생각해 보면, 이 영상은 히스토그램이 평평하므로 어떤 명암 I를 기준으로

생각해 보면 그것보다 작은 명암을 갖는 화소의 비율은 I/L이어야 한다.

평활화를 수행하는 과정에서 사용한 누적 히스토그램이 정확히 그런 역할을 한다.

다시 말해 누적 히스토그램은 비율이 I/L인 점을 I로 매핑해 준다.



아래 그림은 실제 영상에 히스토그램 평활활르 적용한 결과이다. 얼룩말의 줄무늬가 훨씬 선명하고

숲에 있는 나무도 훨씬 잘 보인다.


                                      [그림3 - 히스토그램 평활화]


히스토그램 역투영

히스토그램 역투영(Histogram backprojection) 연산과 이를 활용하여 물체를 검출할 수 있다.

히스토그램을 매핑 함수로 사용하여, 화소 값을 신뢰도 값으로 변환하는 과정이다.

물체의 모양은 무시하고 단순히 컬러 분포만으로 검출하는 방법으로, 히스토그램은 컬러 분포를

표현하는 데 사용된다.


                       [그림4 - HS공간 히스토그램]


히스토그램역투영시 명암 채널만 이용하는 1차원이 아니라, 최소 2차원 이상을 사용해야 한다.

왜나하면 명암은 조명에 따라 쉽게 변할 뿐만 아니라 얼굴과 비슷한 명암을 갖는 다른 영역이 

여러 군데 존재 할 가능성이 높기 때문에 명암만 사용하면 피부에 해당하는 영역을 구별하기 어렵기 때문이다.

따라서 RGB색 공간 영역을 HSI공간으로 변환한 다음, I채널(명암-Intensity)은 무시하고, H채널(색상-hue)과

S채널(채도-Saturation)을 사용한다.



H와 S축을 각각 I단계로 나누면 2차원 히스토그램의 전체 칸 수는 L^2이 되어 넓은 공간이 된다.

축 하나를 표현하는데 1바이트를 사용하면 L = 256이므로 히스토그램 칸 수는 65,536이다.


예를 들어 얼굴 영상은 원래 영상에서 오래낸 것이므로 크기는 100 × 80이다. 

따라서 8,000개의 화소를 65,536개의 칸을 가진 2차원 히스토그램에 뿌리면 

대부분의 칸이 0을 갖는 매우 희소한 공간이 될 것이다.

이런 상황에서는 L단계를 양자화 하여 q단계로 줄이는 것이 좋다. 

아래 코드의 10번째 줄에 나타나 있는 양자화 함수는 아래와 같다.


   (괄호는 소수점 버리는 연산)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
/*
입력 : H와 S채널 영상 fH(j,i), fS(j,i), 0≤j≤M-1, 0≤i≤N-1
출력 : 히스토그램 h(j,i)와 정규 히스토그램 H(j,i), 0≤j,i≤q-1 //L단계를 q단계로 양자화
*/
 
h(j,i), 0≤j,i<q-1을 0으로 초기화
 
for(j=0 to M-1)
   for(i=0 to N-1) // f의 화소 (j, i) 각각에 대한 처리
      h((quantize(fH(j,i)), quantize(fS(j,i))++; // 해당 칸을 1 증가시킴
 
for(j=0 to q-1)
   for(i=0 to q-1) 
   H(j,i) = h(j,i)/(MxN) // 정규화


[그림 4]에서의 q는 64이다. 따라서 원래의 히스토그램의 4x4=16칸을 한 칸으로 축소 시키는 셈이다.


위와 같은 방법으로 히스토그램을 만들었을 때 만든 히스토그램을 Hm이라고 했을때,

새로운 영상 g가 주어지면 Hm을 이용하여 얼굴을 찾아낼 수 있다.


기본 원리는 간단하다. g의 어떤 화소 (j, i)의 H와 S채널값을 (a, b)라고 했을때,

즉 a=gh(j, i)와 b = gs(j, i)일 때  Hm(a, b)의 값이 큰 값을 가지면 그 픽셀은 얼굴일 가능성이 높고

반대면 가능성이 낮다고 볼 수 있다. 다시 말해 Hm은 화소의 값을 얼굴에 해당할 신뢰도 값으로 반환해 준다.


1
2
3
4
5
6
7
8
9
10
11
/*
입력 : H와 S채널 영상 gh(j, i), gs(j, i), 0≤j≤M-1, 0≤i≤N-1 // 얼굴을 검출하려는 영상
       모델 히스토그램 Hm(j, i), 0≤j, i≤q-1
출력 : 가능성 맵 o(j, i), 0≤j≤M-1, 0≤i≤N-1
*/
 
검색 영상을 gh, gs를 위 알고리즘 이용해 정규 히스토그램 Hi를 만든다.
 
for(j=0 to M-1)
  for(i=0 to N-1)
     o(j,i) = Hr(quantize(gh(j,i)), quantize(gs(j,i))); // 역투영


       


아래 그림은 입력영상에 대한 모델 히스토그램을 역투영 하여 얻은 신뢰도 맵(confidence map)을 보여준다.

           

                             [그림5 - 히스토그램 역투영 결과]


흰 영역이 모델 히스토그램과 높은 신뢰도 즉 유사성이 높은 부분이다. 

예상대로 얼굴 부분에서 큰 값을 갖는것을 확인할 수 있다.

또한 손 영역에서 큰 값을 가지는데, 손과 얼굴 색이 비슷하기 때문이다.

만약 피부와 비슷한 색 분포를 갖는 다른 물체나 배경 영역이 있다면 그것도 높은 값을 가지게 

되어 검출 오류가 발생할 것이다. 또한 검출 대상이 여러가지 색 분포를 가지는 경우에는 여러 개의 모델을

사용해야 하며, 결과적으로 검출 오류가 발생할 가능성도 높아진다.

따라서 물체 검출 문제를 풀 때 모양 특징을 주로 사용하며, 상황에 따라 색 분포 정보를 보조로 활용한다.

이런 문제점에도 불구하고 히스토그램 역투영을 적용할 때의 장점도 있다. 히스토그램은 물체의 이동과 회전에 

불변하다. 즉, 이동이나 회전이 발생해도 히스토그램은 변하지 않는다. 따라서 히스토그램 역투영은 같은 

배경 아래에서 물체가 이동하거나 회전해도 성능이 유지된다. 또한 물체의 일부가 가려진 경우에도 잘 작동한다.

배경을 균일하게 꾸밀 수 있는 상황이라면 히스토그램 역투영을 유용하게 활용할 수 있을 것이다.


출처 : 컴퓨터비전(오일석)

'컴퓨터비전/영상처리' 카테고리의 다른 글

bilateral filter  (0) 2014.10.10
영상처리의 기본연산  (0) 2014.10.10
화소 연결성  (0) 2014.10.09
이진영상  (0) 2014.10.09
영상처리란 무엇인가?  (0) 2014.10.09