logo

룩업 테이블과 감마 보정

룩업 테이블

룩업 테이블(look-up table, LUT)은 입력값에 대응하는 출력값을 미리 저장한 변환표. 8비트 이미지의 픽셀값은 0–255이므로 길이가 256인 배열로 모든 변환 결과 표현 가능.

입력 픽셀값 x → lut[x] → 출력 픽셀값

다음 LUT는 각 채널의 픽셀값을 0, 32, 64, …, 224의 8단계로 변환.

step = 32  # 256개 픽셀 값을 8단계로 나누는 간격
lut = (np.arange(256) // step * step).astype(np.uint8)
lut.shape
실행 결과
(256,)
lut[[0, 31, 32, 63, 255]]
실행 결과
array([  0,   0,  32,  32, 224], dtype=uint8)

cv.LUT()는 이미지의 각 픽셀값을 인덱스로 사용하여 변환표의 값으로 교체.

quantized = cv.LUT(image, lut)
to_pil(quantized)

각 채널의 픽셀값을 8단계로 변환한 이미지

감마 보정

선형 보정은 모든 픽셀에 같은 비율과 크기의 변화를 적용. 감마 보정은 픽셀 값을 비선형으로 변환하여 어두운 영역이나 밝은 영역을 선택적으로 조절.

결과=255(255원본)γ
  • γ<1: 어두운 영역을 더 많이 밝게 보정
  • γ>1: 밝은 영역을 더 많이 어둡게 보정

감마 함수로 0–255의 변환 결과를 LUT에 미리 저장하면 모든 픽셀에서 거듭제곱을 반복하지 않아도 됨.

gamma = 0.5  # 어두운 영역을 더 많이 밝히는 값
values = np.arange(256, dtype=np.float32) / 255
lut = np.clip((values ** gamma) * 255, 0, 255).astype(np.uint8)

gamma_corrected = cv.LUT(image, lut)
to_pil(gamma_corrected)

감마 값에 따른 밝기 변환 곡선

퀴즈

문제 1 / 4맞음: 0힌트: 0틀림: 0채점중: 0남음: 4

8비트 이미지의 룩업 테이블을 길이가 256인 배열로 만드는 이유는 무엇인가요?

  • 0부터 255까지 각 입력 픽셀값에 대응하는 출력값을 저장하기 위해
  • 이미지의 가로와 세로 크기를 각각 128로 제한하기 위해
  • BGR 이미지의 세 채널을 하나의 채널로 합치기 위해
  • 픽셀값의 최솟값과 최댓값만 저장하기 위해

퀴즈를 풀려면 대화형 기능을 불러와야 합니다.

Previous
히스토그램