히스토그램 평활화 (equalizer) & 스트레칭 개념 및 실습

2022. 9. 1. 14:15IT/computer vision

SMALL

1. 배경 지식

  • EQ 혹은 이퀄라이저(equalizer)
    • MPS 플레이어에서 클래식, 헤비메탈, 재즈, 팝, 록 등으로 음색을 조정하는 탭에 있는 것
    • 주파수 특성을 균등하게 보정하는 기기임
    • 주파수를 조정할 수 있기 때문에 주파수 특성을 어느 특정의 목적에 맞추어 임의로 변화시켜 원하는 음색을 만들어 낼 수 있음
  • 평활화(equaliztion)
    • 인간의 눈은 영상의 밝기의 크기보다 대비가 증가할 때 인지도가 향상됨
    • 평활화 알고리즘은 히스토그램 평활화의 사전적 의미인 "분포의 균등"이라는 방법을 이용해 명암 대비를 증가시킴
      • 이를 통해 영상의 인지도를 높이며, 영상의 화질을 개선할 수 있음
  • 히스토그램 스트레칭
    • 히스토그램의 분포가 좁은 영상을 스트레칭 하여 히스토그램 분포를 넓게 만듦
    • 반면, 히스토그램의 분포가 좁지는 않지만, 특정 부분에서 한쪽으로 치우친 명암 분포를 가진 영상들이 있을 수 있음
      • 이런 영상들은 명암 분포가 좁지 않기 때문에 스트레칭으로는 문제가 해결되지 않음
  • 히스토그램 평활화 알고리즘
    • 특정 부분에서만 한쪽으로 치우친 명암 분포를 가진 영상을 히스토그램의 재분배 과정을 거쳐서 균등한 히스토그램 분포를 갖게 하는 알고리즘
    1. 영상의 히스토그램을 계산함
    2. 히스토그램 빈도값에서 누적 빈도수(누적합)을 계산함
    3. 누적 빈도수를 정규화(정규화 누적합) 함
    4. 결과 화소값 = 정규화 누적합 * 최대 화소값
  • 예시
    1. 입력 영상에서 히스토그램 계산을 위해 화소값들의 빈도를 계산함
      1. 화소값 2를 가진 화소의 빈도수는 2
    1. 빈도수를 누적하여 누적 빈도수를 계산함
      1. 화소값 2인 경우, 화소값 0과 1의 빈도인 1과 5을 각각 자신의 빈도인 6과 누적시켜 결과적으로 12가 됨
      2. 이렇게 계속 진행하여 마지막 화소값인 7에 이르기까지 빈도수를 계속 누적함
        1. 그 결과 전체 화소 개수가 같은 16이 됨
    2. 각 화소의 누적 빈도수를 전체 화소 개수(16)로 나누어 정규화하여 정규화 누적합을 계산함
      1. 정규화 : 원소 중에서 최댓값으로 각 원소를 나누어 원소들의 값이 0~1 사이의 값을 가지게 표현하는 것임
    평활화 결과 화소값 = [입력 화소의 정규화 누적합 * 최대 화소값]
    1. 평활화 결과 : 입력 화소의 정규화된 누적합 값에 화소 최댓값을 곱해줌
      1. 입력 화소 2인 경우, 정규화 누적합은 12/16 = 0.75이므로, 평활화 결과 화소값은 0.75*7 = 5.25이고, 결과 화소값은 5가 됨

2. 히스토그램 평활화

학습 목표 : Histogram Equalization(히스토그램 평탄화/평활화)를 이해하기
아래의 문제 풀이를 통해서 히스토그램 평탄화 과정을 마스터하시기 바란다. 아래의 입력 영상에 히스토그램 평탄화를 적용했을 때 결과 영상이 어떻게 되는지 픽셀 값을 채워 보시오. 단, 픽셀의 밝기 단계는 8단계로써 픽셀의 최대 값은 7로 가정한다. 교재(OpenCV-Python으로 배우는 영상처리 및 응용) 6장 251~253페이지를 참고해서 직접 풀어 보기 바란다. 그리고 입력영상과 결과영상의 히스토그램을 비교해 보기 바란다.

3. 입력, 결과 영상 히스토그램 비교

  • 히스토그램

1. 배경 지식

  • EQ 혹은 이퀄라이저(equalizer)
    • MPS 플레이어에서 클래식, 헤비메탈, 재즈, 팝, 록 등으로 음색을 조정하는 탭에 있는 것
    • 주파수 특성을 균등하게 보정하는 기기임
    • 주파수를 조정할 수 있기 때문에 주파수 특성을 어느 특정의 목적에 맞추어 임의로 변화시켜 원하는 음색을 만들어 낼 수 있음
  • 평활화(equaliztion)
    • 인간의 눈은 영상의 밝기의 크기보다 대비가 증가할 때 인지도가 향상됨
    • 평활화 알고리즘은 히스토그램 평활화의 사전적 의미인 "분포의 균등"이라는 방법을 이용해 명암 대비를 증가시킴
      • 이를 통해 영상의 인지도를 높이며, 영상의 화질을 개선할 수 있음
  • 히스토그램 스트레칭
    • 히스토그램의 분포가 좁은 영상을 스트레칭 하여 히스토그램 분포를 넓게 만듦
    • 반면, 히스토그램의 분포가 좁지는 않지만, 특정 부분에서 한쪽으로 치우친 명암 분포를 가진 영상들이 있을 수 있음
      • 이런 영상들은 명암 분포가 좁지 않기 때문에 스트레칭으로는 문제가 해결되지 않음
  • 히스토그램 평활화 알고리즘
    • 특정 부분에서만 한쪽으로 치우친 명암 분포를 가진 영상을 히스토그램의 재분배 과정을 거쳐서 균등한 히스토그램 분포를 갖게 하는 알고리즘
    1. 영상의 히스토그램을 계산함
    2. 히스토그램 빈도값에서 누적 빈도수(누적합)을 계산함
    3. 누적 빈도수를 정규화(정규화 누적합) 함
    4. 결과 화소값 = 정규화 누적합 * 최대 화소값
    1. 입력 영상에서 히스토그램 계산을 위해 화소값들의 빈도를 계산함
      1. 화소값 2를 가진 화소의 빈도수는 2

  1. 빈도수를 누적하여 누적 빈도수를 계산함
    1. 화소값 2인 경우, 화소값 0과 1의 빈도인 1과 5을 각각 자신의 빈도인 6과 누적시켜 결과적으로 12가 됨
    2. 이렇게 계속 진행하여 마지막 화소값인 7에 이르기까지 빈도수를 계속 누적함
      1. 그 결과 전체 화소 개수가 같은 16이 됨
  2. 각 화소의 누적 빈도수를 전체 화소 개수(16)로 나누어 정규화하여 정규화 누적합을 계산함
    1. 정규화 : 원소 중에서 최댓값으로 각 원소를 나누어 원소들의 값이 0~1 사이의 값을 가지게 표현하는 것임

평활화 결과 화소값 = [입력 화소의 정규화 누적합 * 최대 화소값]

  1. 평활화 결과 : 입력 화소의 정규화된 누적합 값에 화소 최댓값을 곱해줌
    1. 입력 화소 2인 경우, 정규화 누적합은 12/16 = 0.75이므로, 평활화 결과 화소값은 0.75*7 = 5.25이고, 결과 화소값은 5가 됨

 

2. 히스토그램 평활화

5주차 학습목표는 Histogram Equalization(히스토그램 평탄화/평활화)를 이해하는 것이다. 아래의 문제 풀이를 통해서 히스토그램 평탄화 과정을 마스터하시기 바란다. 아래의 입력 영상에 히스토그램 평탄화를 적용했을 때 결과 영상이 어떻게 되는지 픽셀 값을 채워 보시오. 단, 픽셀의 밝기 단계는 8단계로써 픽셀의 최대 값은 7로 가정한다. 교재(OpenCV-Python으로 배우는 영상처리 및 응용) 6장 251~253페이지를 참고해서 직접 풀어 보기 바란다. 그리고 입력영상과 결과영상의 히스토그램을 비교해 보기 바란다.

3. 입력, 결과 영상 히스토그램 비교

  • 히스토그램

히스토그램 전 후 비교

  • 예제 6.3.6 히스토그램 평활화 Code

LIST