본문 바로가기
CV(컴퓨터비전)

파이썬 사진 밝기 조절하기

by Tripleler 2022. 4. 11.

이번 포스팅에서는 사진의 밝기를 조절하는 법에 대해 알아보고자 한다.

 

사진을 불러와보자.

import sys
import cv2

img = cv2.imread('../icon/flowers.jpg')
img = cv2.resize(img, (480, 320))

if img is None:
    print('Image load failed!')
    sys.exit()

cv2.imshow('raw_img', img)
cv2.moveWindow('raw_img', 100, 100)
cv2.waitKey()
cv2.destroyAllWindows()

꽃밭 사진이다.

 

색은 3가지 색(빨강, 초록, 파랑)이 각각 0~255의 값으로 매치되어 나타낼 수 있다.

따라서 색마다 256까지의 채널을 나타내야 하고, 이는 16진수로 표현이 가능하다.

(16진수 : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F)

 

가령 #A985FF는

R값은 16*10+9   = 169

G값은 16*8+5    = 133

B값은 16*15+15 = 255

가 된다.

 

특히, #FFFFFF는 RGB(255, 255, 255)로 흰색을,

#000000은 RGB(0, 0, 0)로 검은색을 나타낸다.

 

따라서 밝기를 조절하고 싶으면 RGB에 전부 같은 값을 추가하면 밝하지고, 빼면 어두워진다.

 

 

 

 

밝기 조절에 앞서 다음 코드를 살펴보자.

import cv2
import numpy as np

val = 0

while True:
    mask = np.full(img.shape, (val, val, val), dtype=np.uint8)
    cv2.imshow('mask', mask)
    cv2.moveWindow('mask', 100, 100)
    key = cv2.waitKey()
    if key == 27:
        break
    val += 5
cv2.destroyAllWindows()

esc키를 제외한 아무키나 꾸욱 눌러주면 모든 배열값이 전부 5씩 증가한다.

mask의 타입이 uint8이기 때문에 \(2^8-1=255\)까지 나타낼 수 있고,

255를 넘어가면 0부터 다시 증가한다

 

따라서 위의 gif처럼 나타난다.

이제 저 마스크를 꽃 사진에 집어넣어보자.

import sys
import cv2
import numpy as np

img = cv2.imread('../icon/flowers.jpg')
img = cv2.resize(img, (480, 320))

if img is None:
    print('Image load failed!')
    sys.exit()

val = 0

while True:
    mask = np.full((320, 480, 3), (val, val, val), dtype=np.uint8)
    cv2.imshow('mask img', img+mask)
    cv2.moveWindow('mask img', 100, 100)
    key = cv2.waitKey()
    if key == 27:
        break
    val += 5
cv2.destroyAllWindows()

뭔가 이상하다. 이유가 뭘까?

 

 

 

 

 

 

 

어떤 색이 RGB(250, 250, 100)이라고 하자. 대충 하늘색 계열의 색이다.

그런데 RGB(5, 5, 5)씩 두번을 증가시키면 RGB(4, 4, 110)이라는 파란색이 튀어나와 버린다.

255가 넘지 못하도록 제한을 걸 필요가 있어보인다.

 

다음 코드를 보자.

while True:
    mask = np.full((320, 480, 3), (val, val, val))
    cv2.imshow('mask img', np.clip(img+mask, 0, 255).astype(np.uint8))
    cv2.moveWindow('mask img', 100, 100)
    key = cv2.waitKey()
    if key == 27:
        break
    val += 5
cv2.destroyAllWindows()

mask에서 dtype제한을 풀고, np.clip함수를 이용해서 최소, 최대 제한을 걸었다.

계속 증가하다 보면 RGB(255, 255, 255)인 흰색으로 수렴한다.

img+mask대신에 img-mask를 통해 어둡게도 가능하다.

 

 

 

 

 

np.clip함수 대신에 cv2.add, cv2.subtract도 가능하다.

val = 100
mask = np.full((320, 480, 3), (val, val, val)).astype(np.uint8)

lightness = cv2.add(img, mask)
cv2.imshow('light_img', lightness)
cv2.moveWindow('light_img', 580, 100)

darkness = cv2.subtract(img, mask)
cv2.imshow('dark_img', darkness)
cv2.moveWindow('dark_img', 1060, 100)

cv2.imshow('raw_img', img)
cv2.moveWindow('raw_img', 100, 100)
cv2.waitKey()
cv2.destroyAllWindows()

cv2.add는 배열끼리의 합을, subtract는 차를 반환한다.

'CV(컴퓨터비전)' 카테고리의 다른 글

얼굴 비대칭 확인하기  (0) 2022.05.23
동영상 잘라내기  (0) 2022.04.05
Affine Transformation  (0) 2022.03.14
이미지 전단변환  (0) 2022.03.06
이미지 회전하기  (0) 2022.02.03

댓글