이미지의 밝기를 조절하기 위해 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])
밝은 이미지의 경우 Y 채널을 reverse한 뒤에 연산을 수행하며 최종적으로 다시 reverse 해주어 원래 이미지를 반환한다.