본문 바로가기
공부/Study

[파이썬 OpenCV] 이미지 밝기 조절

by 김샤랑 2021. 9. 20.

[파이썬 OpenCV] 이미지 밝기 조절


 

최근에 openCV에 대해서 배우고 있습니다. 

Gray 이미지는 픽셀 값이 0 ~ 255 사이값으로 이루어져 있습니다. 

 

1. I'(x,y) = I(x,y)+val

간단히 이미지에 +value, -value를 하여 밝기를 조절할 수 있습니다.

하지만 더한 값이 max값인 255를 초과하면 오버플로우가 발생하게 됩니다. 언더플로우도 마찬가지입니다. val값은 50으로 설정했습니다.

 


def brightness(gray, val):

res_img = gray.copy()
res_img = res_img - val 
return res_img

 

원본 이미지와 밝기를 낮춘 언더플로우 발생 이미지 res_img= res_img - val

위 사진과 같이 단순히 값을 뺴게 되면 원하는 밝기 조절이 된 이미지를 가질 수 없습니다. 이미지의 밝기를 조절할 때 오버플로우되는 곳들을 막아서 max255, ,min0을 유지시키면 원하는 이미지 밝기 조절을 할 수 있습니다.

 

 

2. I'(x,y) = clip(0, 255, I(x,y)+val

밝기의 범위를 오버플로우 하지 않기 위해서는 넘파이 함수를 이용해, np.clip을 사용할 수 있습니다. 

np.clip(img, min, max)으로 배열 img 중 최솟값(min) 보다 작은 것은 min으로, 최댓값(max) 보다 큰 것은 max로 대체해줍니다. 저는 min에 0, max 255를 넣었습니다.

 

#np. clip(res_img - 50.0255). astype(np.uint8) 

#. astype(np.uint8)은 양수만 표현 가능하게 해 줍니다. 0~255

# value값 뒤에. 을 붙여서 실수로 만듭니다.

 

def brightness(gray, val):

res_img = gray.copy()
res_img = np.clip(res_img - 50., 0, 255). astype(np.uint8)  #val=-50
return res_img

 

원본 이미지와 np.clip을 이용해 밝기를 낮춘 이미지

 

3. opencv에서는 cv2.add, cv2.subtract 함수를 제공해줍니다.

이 함수들을 사용하여 각 픽셀 값에 덧셈과 뺄셈으로 오버플로우 없이 밝기를 조절할 수 있습니다. 2번과 똑같은 결과를 확인할 수 있습니다.

 

def brightness(gray, val):

res_img = gray.copy()
res_img = cv2.subtract(res_img, val)
return res_img

 

원본이미지와 cv2.subtract를 이용해 밝기를 낮춘 이미지  res_img = cv3.subtract(res_img, val)

 

 

댓글