yebeen.kim

3_1 Histogram equalization 본문

24학년도 2학기/컴퓨터 비전

3_1 Histogram equalization

yebeen.kim 2024. 9. 9. 17:47

히스토그램(Histogram) 이란?

  • 이미지의 픽셀 값(강도, intensity 수준)에 따른 분포를 나타내는 그래프
  • 각 강도 수준에 해당하는 픽셀 수를 세어 표현하며, 일반적으로 이미지의 밝기나 색상에 따른 변화를 시각적으로 확인할 수 있다.
  • 히스토그램의 빈(bin) 수는 이미지에서 표현 가능한 강도 값의 범위인 L에 해당한다.

강도 수준 범위 : [0, L - 1]

 

히스토그램 정규화 (Histogram normalization)

  • 각 강도 값에 해당하는 픽셀 수를 전체 픽셀 수로 나누는 과정
  • 이를 통해 히스토그램을 확률 분포 함수(probability function)로 해석할 수 있다. 
  • 즉, 각 강도 수준에 대한 픽셀 비율을 계산하여 이미지의 전체적인 밝기 분포를 파악할 수 있게 됩니다.

히스토그램 계산하는 방법

예시)

0 0 0 0 0
0 0 1 1 1
1 1 1 1 1
2 2 2 2 2
2 3 3 3 3
3 3 3 7 10

 

  • Intensity level is 16 [0, 15]

설명

  • 6 x 5 배열로, 30개의 픽셀로 이루어져있다.
  • 강도 수준은 [0, 15] 까지 존재하며, 주어진 빈(bin)의 개수는 4개이다.
  • 주어진 배열에서 각 강도 수준의 픽셀 수를 세고, 이를 각 빈에 맞춰 정리한다

1번째 빈 : [0 ~ 3]

강도 0, 1, 2, 3 에 해당하는 픽셀을 센다

0 (7개) + 1 (5개) + 2 (5개) + 3 (11개) = 28개 / 30개

 

2번째 빈 : [4 ~ 7]

강도 4, 5, 6, 7 에 해당하는 픽셀을 센다

7 (1개) = 1개 / 30개

 

3번째 빈 : [8 ~ 11]

강도 8, 9, 10, 11 에 해당하는 픽셀을 센다

10 (1개) = 1개 / 30개

 

4번째 빈 : [12 ~ 15]

강도 12, 13, 14, 15 에 해당하는 픽셀을 센다

0개 / 30개

 

결론 : 각 빈에 해당하는 픽셀 비율은 다음과 같다. 

  • Number of bins : 4
    • 1st bin [0-3] : 28/30
    • 2nd bin [4-7] : 1/30
    • 3rd bin [8-11] : 1/30
    • 4th bin [12-15] : 0/30

히스토그램 평활화 (Histogram Equalization)

  • 히스토그램 평활화는 이미지의 대비(Contrast)를 개선하는 방법입니다.
    • 이미지를 보다 선명하게 만들어 객체를 쉽게 구분할 수 있도록 돕습니다.
  • 이 작업은 이미지의 픽셀 값이 특정 범위에 집중되어 있을 때, 강도 값을 재분배하여 균일한 밝기 분포를 만드는 과정을 포함한다.
  • 대비(Contrast): 밝기 또는 색상의 차이로 인해 객체가 더욱 두드러져 보이는 정도
    • 대비는 이미지의 강도 값 분포에 따라 결정된다, 강도 값의 차이가 클수록 대비가 높아진다

intensity 값이 고르게 분배되어있을때 높은 대비값을 가지고 있다고 볼 수 있다.

 

1. 히스토그램 계산 (Histogram computation)

  • 먼저, 입력 이미지의 히스토그램을 계산하는 과정이다. 각 픽셀의 강도 값을 기준으로 픽셀의 분포를 확인하여 히스토그램을 작성한다. 이를 통해 이미지가 밝은 부분, 어두운 부분, 또는 특정 강도에 집중되어 있는지 파악할 수 있다.

2. 픽셀 값을 균일하게 분포시키는 매핑 함수 찾기 (Find mapping function which distributes pixel values uniformly)

  • 다음으로, 픽셀 값을 균일하게 분포시키기 위한 매핑 함수를 찾는 단계이다.
  • 이 함수는 히스토그램의 누적 분포 함수(CDF)를 사용하여 생성된다.
  • 이를 통해 기존 픽셀 값이 새로운 픽셀 값으로 변환되며, 이미지의 대비를 조정할 수 있게 된다.

3. 입력 이미지에 매핑 함수 적용 (Apply the mapping function to an input image)

  • 마지막으로, 찾은 매핑 함수를 입력 이미지에 적용하는 과정이다.
  • 각 픽셀의 강도 값은 매핑 함수를 통해 새롭게 변환되며, 이를 통해 히스토그램이 균일하게 조정된 이미지를 생성하게 된다.
  • 예시 코드 )
int main() {
    Mat image;
    Mat hist_equalized_image;
    image = imread("lena.png", 0);  // 그레이스케일 이미지 로드
    if (!image.data) exit(1);  // 이미지 로드 실패 시 종료
    equalizeHist(image, hist_equalized_image);  // 히스토그램 평활화 적용
    imshow("Input Image", image);  // 원본 이미지 출력
    imshow("Hist Equalized Image", hist_equalized_image);  // 평활화된 이미지 출력
    waitKey(0);  // 키 입력 대기 후 종료
    return 0;
}

 

 

히스토그램 평활화의 한계

  • 히스토그램 평활화가 항상 이미지를 향상시키는 것은 아니다.
  • 특히, 특정 강도 범위의 픽셀 값이 우세한 이미지에서는 오히려 이미지의 디테일이 손상되거나, 과도하게 대비가 증가하여 불필요한 노이즈가 발생할 수 있다.
  • 따라서 이미지에 따라 히스토그램 평활화의 효과는 달라질 수 있다.