Image Adaptive Gamma Correction with Weighted Distribution

‍이세현·2024년 2월 2일
1

이미지의 밝기를 조절하기 위해 adaptive gamma correction을 참고하였다.

밝기 판단

입력된 이미지 Y 채널의 값에 따라 밝은지 어두운지 판단한다.

img = cv2.imread(path)
name = path.split('\\')[-1].split('.')[0]
        
YCrCb = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)
Y = YCrCb[:,:,0]

threshold = 0.3
exp_in = 112 # Expected global average intensity 
M,N = img.shape[:2]
mean_in = np.sum(Y/(M*N)) 
t = (mean_in - exp_in)/ exp_in
        
# if t < -threshold: # 어두운 이미지 -> 밝게 조정
# if t > threshold:  # 밝은 이미지 -> 어둡게 조정
# else:              # 밝기 조정 없음

밝기 조정

  • histogram: Y 채널에 대한 histogram (256, )
  • cdf: Y 채널에 대한 histogram 누적합 (256, )
  • cdf_normalized: cdf 정규화(0~1 사이로 변경) (256, )
  • prob_normalized: histogram 총합이 1이되게 정규화 (256, )
  • unique_intensity: img(Y 채널)에서 중복 제거
  • probmin, prob_max: 정규화했을 때 가장 가능성 높은 Y 값(0.013)과 가장 낮은 Y 값(0.0)
  • pn_temp: 전체 probability 차이(max - min) 중에서 현재 픽셀이 얼마나 밝은지(각 값을 0~1 범위로 정규화)
  • prob_normalized_wd: pn_temp 총합이 1이 되게 조절

결과물


밝은 이미지가 많이 어두워진다고 판단하여 normalization 범위를 [0:1]에서 [0~1.5]로 수정하였다.

prob_normalized_wd = pn_temp / pn_temp.sum() * normalize # normalize to [0,normalize]
cdf_prob_normalized_wd = prob_normalized_wd.cumsum()

if truncated_cdf:
    inverse_cdf = np.maximum(normalize/2, normalize - cdf_prob_normalized_wd)
else:
    inverse_cdf = normalize - cdf_prob_normalized_wd

img_new = img.copy()
for i in unique_intensity:
    img_new[img == i] = np.round(255 * (i / 255) ** inverse_cdf[i])

P.S

밝은 이미지의 경우 Y 채널을 reverse한 뒤에 연산을 수행하며 최종적으로 다시 reverse 해주어 원래 이미지를 반환한다.

profile
Hi, there 👋

0개의 댓글

관련 채용 정보