본문 바로가기
Image Processing (Python)

Gamma Correction (감마 보정)

by HanByol Jang 2021. 11. 19.
728x90

함수 설명

이미지가 너무 어둡거나 밝은 경우, 픽셀 값의 변화를 통해 밝기를 보정하는 작업을 합니다.

 

간단한 방법으로는 모든 픽셀 값을 동일한 비율만큼 증가시키거나 감소시키는 것입니다. 이를 선형적 방법이라고 부릅니다. 하지만 선형적 방법으로 보정을 하게 되면 전체적인 밝기가 일괄적으로 변화하게 됩니다.

gamma correction equation

반면, Gamma correction (감마 보정)은 모든 픽셀을 동일한 비율로 변화시키지 않습니다. 

위의 식처럼 픽셀 값들이 각각 다른 비율로 변하게 되고, 이러한 변화방법을 비선형 방법이라고 부릅니다.

 

아래 그래프처럼 감마 값에 따라 변화의 방향이 달라집니다.

gamma > 1이면 어두운 영역의 변화폭은 크고 밝은 영역의 변화폭은 작습니다. 그러므로 밝은 영역이 급격하게 밝아지지 않고 유지되면서, 어두웠던 영역만 잘 보이게 됩니다.

반대로 gamma < 1이면 밝은 영역의 변화폭이 크고 어두운 영역의 변화폭은 작습니다. 그러므로 어두운 영역이 급격하게 어두워지지 않은 채로, 밝은 영역만 잘 보이게 됩니다. 

gamma 에 따른 pixel 값 변화


코드 설명

python3 기반 numpy 라이브러리를 사용했습니다. 

보통의 jpg, png, tif 이미지를 python에서 read시 [0-255] 사이의 픽셀값을 가지는 uint8 이미지입니다.

그러므로 아래와 같은 순서로 gamma correction 을 진행합니다.

 

1. 실수형(float32)로 바꾸기

float_image = np.float32(image)

 

2. [0-1] 사이의 픽셀값을 가지도록 normalization

normal_image = float_image / 255

 

3. gamma coreection 식을 적용

gamma_image = normal_image  ** (1 / gamma)

 

4. [0-255] 사이의 픽셀값을 가지는 uint8로 복원

output = np.uint8(gamma_image * 255)


예제

Grayscale 이미지를 가지고 gamma에 따른 변화에 대해 살펴보는 예제입니다.

import cv2
import numpy as np
import matplotlib.pyplot as plt
from skimage import io

# Gamma Correction Equation
def gamma_correction(image, gamma=1.0):
    inv_gamma = 1 / gamma
    output = np.uint8(((image / 255) ** inv_gamma) * 255)
    return output

# Image Load
image = io.imread('test.jpg')

# Grayscale
gray_image = np.float32(cv2.cvtColor(image, cv2.COLOR_RGB2GRAY))

# 0.5, 2.2 gamma
output1 = gamma_correction(gray_image, gamma=0.5)
output2 = gamma_correction(gray_image, gamma=2.2)

# View
plt.subplot(1,3,1)
plt.title('Original')
plt.axis('off')
plt.imshow(gray_image, cmap='gray')

plt.subplot(1,3,2)
plt.title('Gamma = 0.5')
plt.axis('off')
plt.imshow(output1, cmap='gray')

plt.subplot(1,3,3)
plt.title('Gamma = 2.2')
plt.axis('off')
plt.imshow(output2, cmap='gray')

plt.show()

 

감마에 따라 이미지의 밝기가 변화되는 것을 확인 할 수 있습니다.

728x90

'Image Processing (Python)' 카테고리의 다른 글

Denoising (non-local)  (0) 2021.11.23
Color Space Change (색공간 변경)  (0) 2021.11.22
Embossing (엠보싱)  (0) 2021.11.18
Smoothing  (0) 2021.11.17
Flip (대칭)  (0) 2021.11.16

댓글