룩업 테이블과 감마 보정
룩업 테이블
룩업 테이블(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)

감마 보정
선형 보정은 모든 픽셀에 같은 비율과 크기의 변화를 적용. 감마 보정은 픽셀 값을 비선형으로 변환하여 어두운 영역이나 밝은 영역을 선택적으로 조절.
- : 어두운 영역을 더 많이 밝게 보정
- : 밝은 영역을 더 많이 어둡게 보정
감마 함수로 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)
