파이썬 강의/openCV

파이썬 openCV 2. 감마 보정(Gamma Correction)

마리사라 2020. 11. 15. 13:00
반응형

파이썬 openCV의 두 번째 강의 감마보정(Gamma Correction)입니다.

 

원래 사람의 눈은 컴퓨터가 처리하는 밝기와 다르게 반응합니다. 그래서 어두운곳은 0, 밝은곳을 255로 아무 보정 없이 매칭하게 되면 사람의 눈은 부자연스럽게 느끼게 되는데요. 그래서 나온것이 바로 감마 보정입니다. 감마 부호화(gamma encoding)가 더 맞는 표현이라고 하지만, 우리가 배울때는 감마 보정이라고 배우잖아요? 그래서 저도 감마 보정이라고 하겠습니다.


0. 감마 보정

감마 보정의 공식은 단순하게 쓰면

Output = Input^gamma

라고 할 수 있습니다. 감마값이 1을 기준으로 높으면 어두워지고, 낮으면 밝아지는 구조이죠. 


1. openCV에서의 감마 보정

openCV에서 감마보정을 할때 단순히 원래 화소에 감마값을 곱해버리면 안됩니다. 예를들어 어떤 화소의 값이 200인 화소가 있다고 할 때, 감마값을 1.1만 준다고 해도 약 340으로, 255를 넘어서는 오버 플로우가 발생하게 됩니다.

그렇기에 openCV에서는 감마 보정을 할 때, 정규화 라는것을 하게 되는데요. 정규화는 [0, 1]사이의 값으로 전부 바꾸어 버리는 겁니다. 가장 밝은 값이 0이고, 가장 어두운 값이 255라면 모든 값에 255를 나누어 버리면 전부 0에서 1사이에 있는 값이 되겠죠?

이제 코드를 하나하나 보면서 설명해드리겠습니다.

 

import numpy as np

이번 시간에는 numpy 모듈이 필요합니다. 그래서 numpy를 import 해주시구요. cv2모듈은 항상 필요하니 생략!

 

g = float(input("감마값 : "))

이제 감마값을 입력 받아서 저장하는 부분이 있어야겠죠? 이때 감마값은 소수가 될 수 있게 float형으로 저장합니다.

 

img = cv2.imread("lenna.png")

감마 보정을 할 이미지를 불러와줍니다.

 

out = img.copy()

출력할 이미지를 담을 수 있는 변수를 선언해서 원래 이미지를 복사해 줍니다.( copy() )

 

out = out.astpye(np.float)

정규화를 시키려면 모든 값에 255를 나누어 주어야한다고 했죠? 그런데 openCV에서는 기본적으로 int형을 사용합니다. 그래서 out에 있는 모든 값의 타입을 float(실수)형으로 바꾸어 주어야 합니다.

 

out = ((out / 255) ** (1 / g)) * 255

순서대로 보시면, out / 255를 통해 모든 값을 정규화 해 줍니다. 그 후 ** (1 / g)를 통해 (1 / g)만큼 제곱을 해주는데요.

여기서 왜 g제곱이 아니라 (1 / g)제곱이냐면, 값이 높아질수록 밝기가 같이 올라가도록 하기 위해서 입니다.

마지막으로 다시 255를 곱해주어서 원래의 형식으로 바꾸어 주는것으로 끝이 납니다.

 

out = out.astpye(np.uint8)

이제 출력을 위해 다시 int(정수형)으로 바꾸어 주시면 감마 보정이 끝이납니다.

 

이제 두 영상을 확인해볼까요?

원본영상
감마 보정 영상(감마 : 2.2)
감마 보정 영상(감마 : 0.5)


2. 마치며

감마 보정도 이진화와 마찬가지로 중반부에 알려주는 곳이 많은데요. 저는 글을 올리는 순서가 제가 배웠던 순서로 올려서 조금 불편하거나 이해가 안되는 분들도 계실겁니다. 하지만 대부분의 코드는 다룰 예정이니 조금만 더 기다려주세요~

 

 

import cv2
import numpy as np


g = float(input("감마 값 : "))
img = cv2.imread("lenna.png")
out = img.copy()
out = img.astype(np.float)
out = ((out / 255) ** (1 / g)) * 255
out = out.astype(np.uint8)
cv2.imshow("original", img)
cv2.imshow("gamma", out)
cv2.waitKey(0)
반응형