Skip to main content

색 보정

히스토그램

  • 채널별로 밝기의 분포를 시각화
    import matplotlib.pyplot as plt
    for i, color in enumerate('bgr'):
    hist = cv.calcHist([image], [i], mask=None, histSize=[256], ranges=[0, 256])
    plt.plot(hist, color=color)
  • 빨간색은 어두운 영역에 많고, 초록색은 중간, 파란색은 밝은 영역에 많음

히스토그램 균일화

  • 밝기 분포를(히스토그램) 고르게 만듦(균일화)
    src = cv.imread('xray.jpg', cv.IMREAD_GRAYSCALE) # 흑백으로 열기
    hist1 = cv.calcHist([src], [0], mask=None, histSize=[256], ranges=[0, 256])
    eqd = cv.equalizeHist(src) # 히스토그램 균일화
    hist2 = cv.calcHist([eqd], [0], mask=None, histSize=[256], ranges=[0, 256])
  • 전반적으로 뿌연 밝기
  • 검은 부분이 없음
  • 하얀 부분도 없음
  • 어두운 곳은 확실히 어둡게
  • 밝은 곳은 확실히 밝게

CLAHE

  • 히스토그램 균일화는 전반적으로 이미지가 선명해지기는 하지만
  • 어두운 부분은 너무 어두워지고, 밝은 부분은 너무 밝아져서 디테일이 사라짐
  • CLAHE(Contrast Limited Adaptive Histogram Equalization)는 그림을 고정된 크기의 타일로 나누어, 타일별로 히스토그램 균일화
  • 노이즈가 있을 수 있으므로 제한을 넘는 값은 모든 영역에 균일하게 배분
    clahe = cv.createCLAHE(
    clipLimit=2.0, # 밝기 제한을 설정. 보통 2.0-4.0
    tileGridSize=(8, 8)) # 이미지를 가로 8개, 세로 8개의 타일 -> 총 64개로 나눔
    clahed = clahe.apply(src)
  • 히스토그램 균일화와 달리 갈비뼈가 뚜렷하게 보임

컬러 이미지의 히스토그램 균일화

  • BGR에서 균일화하면 선명해지기는 하지만 색상 간의 비율이 달라져서 색상이 바뀜
    src = cv.imread('low.jpg')
    b,g,r = cv.split(src)
    be = cv.equalizeHist(b) # 파랑의 균일화
    ge = cv.equalizeHist(g) # 초록의 균일화
    re = cv.equalizeHist(r) # 빨강의 균일화
    eqd1 = cv.merge((be,ge,re)) # 결합
  • src: 전반적으로 뿌옇다
  • eqd1: 선명해졌지만 색상의 비율이 달라졌음

컬러 이미지의 히스토그램 균일화

hsv = cv.cvtColor(src, cv.COLOR_BGR2HSV) # HSV로 바꿈
h,s,v = cv.split(hsv) # 색상(H) 채도(S) 명도(V)를 분리
eqd_v = cv.equalizeHist(v) # 밝기만 균일화(어두운 곳은 어둡게, 밝은 곳은 밝게)
mgd = cv.merge((h,s,eqd_v)) # 색상과 채도는 그대로, 밝기만 바꿔서 합침
eqd2 = cv.cvtColor(mgd, cv.COLOR_HSV2BGR) # BGR로 바꿈
  • src: 전반적으로 뿌옇다
  • eqd2: 색상과 채도는 유지하면서 밝기만 균일화되어 선명해짐

퀴즈