사람의 눈 VS 카메라 센서
실제 눈으로 보는 것 보다 카메라로 찍으면 다른데?! 하는 순간이 있는데,
그건 사람의 눈과 카메라 센서는 빛을 인식하는 부분에 있어 차이가 있기 때문이다.
사람의 눈 | 카메라 센서 |
|
|
따라서, 이 차이를 보정하기 위해 감마보정(Gamma Correction)이 필요하다.
2. 감마 보정이란? (Power Law Transform)
감마 보정은 픽셀 강도를 전형적인 전원 법칙(power-law) 변환으로 매핑하는 기법
- 입력 영상의 픽셀 값을 [0,255] 범위에서 [0.0,1.0] 범위로 정규화
- 아래 식을 적용하여 보정
- I = 정규화된 입력 픽셀 값
- G = 사용자가 지정하는 감마 값
- G<1 → 출력이 더 어두워짐
- G>1 → 출력이 더 밝아짐
- G=1 → 원본과 동일
- O = 변환 후 출력 픽셀 값 (다시 [0,255] 범위로 스케일)
3. cv2.LUT(image, table) 을 사용해 감마보정 수행
3-1. 코드
from matplotlib import pyplot as plt
import numpy as np
import cv2
def adjust_gamma(image, gamma=1.0):
invGamma = 1.0 / gamma
table = np.array([((i / 255.0) ** invGamma) * 255
for i in np.arange(0, 256)]).astype("uint8")
return cv2.LUT(image, table)
args = {
"image": "example_02.png"
}
original = cv2.imread(args["image"])
# 여러 감마값을 확인
for gamma in np.arange(0.0, 3.5, 0.5):
# 감마=1이면 아무 변화가 없으므로 무시하기
if gamma == 1:
continue
gamma = gamma if gamma > 0 else 0.1
adjusted = adjust_gamma(original, gamma=gamma)
cv2.putText(adjusted, "g={}".format(gamma), (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 3)
plt_imshow("Images", np.hstack([original, adjusted]))
3-2. 결과해석
- Gamma < 1 (예: 0.1, 0.5): 원본보다 훨씬 어두워져 디테일이 소실됨
- Gamma = 1.5: 어두운 이미지에서 디테일이 적절하게 살아남
- Gamma ≥ 2.0: 너무 밝아져 ‘washed out’ 현상 발생
출처
OpenCV Gamma Correction - PyImageSearch
In this tutorial I'll show you how to implement a super fast, easy to use Gamma correction function using Python and OpenCV. Click here to learn more.
pyimagesearch.com
'PyImageSearch' 카테고리의 다른 글
CDF(누적 분포 함수) (0) | 2025.06.16 |
---|---|
OpenCV - Histogram Matching (0) | 2025.06.16 |
OpenCV - Histogram Equalization (0) | 2025.06.16 |
OpenCV - Image Histograms (0) | 2025.06.15 |
OpenCV - Edge detection (0) | 2025.06.14 |