Python/파이썬 OpenCV 공부

[파이썬 OpenCV] 영상의 밝기 조절 - cv2.add, np.clip

AI 꿈나무 2020. 9. 27. 16:25
반응형

황선규 박사님의 OpenCV 강의를 공부하면서 정리하였습니다.

 


영상의 화소 처리 기법

 화소 처리(Point processing)

• 입력 영상의 특정 좌표 픽셀 값을 변경하여 출력 영상의 해당 좌표 픽셀 값으로 설정하는 연산입니다.

• 결과 영상의 픽셀 값이 정해진 범위(ex. 그레이스케일)에 있어야 합니다.

• 반전, 밝기 조절, 명암비 조절 등을 할 수 있습니다.

 

영상의 밝기 조절

 밝기 조절이란?

• 영상을 전체적으로 더욱 밝거나 어둡게 만드는 연산입니다.

 

 밝기 조절 수식

 출력값이 0보다 작을 때는 0으로 반환하고, 255보다 클 때는 255로 출력하는 작업이 필요합니다.

 이를 saturate연산이라고 합니다.

 

1. 영상의 밝기 조절을 위한 영상의 덧셈 연산 - cv2.add

 OpenCV에서는 cv2.add 함수로 덧셈 연산을 제공하고 있습니다.

 cv2.add 함수를 이용해서 각 픽셀값에 덧셈하여 밝기를 조절할 수 있습니다.

 

[함수 설명]

cv2.add(src1, src2, dst=None, mask=None, dtype=None) -> dst

 

• src1 : (입력) 첫 번째 영상 또는 스칼라

• src2 : (입력) 두 번째 영상 또는 스칼라

• dst : (출력) 덧셈 연산의 결과 영상

• mask : 마스크 영상

• dtype : 출력 영상(dst)의 타입. (e.g.) cv2.CV_8U, cv2.CV_32F 등

 

[참고 사항]

 스칼라(scalar)는 실수 값 하나 또는 실수 값 네 개로 구성된 튜플입니다.

 dst를 함수 인자로 전달하려면 dst의 크기가 src1, src2와 같아야 하며, 타입이 적절해야 합니다.

 

[예제 코드]

 그레이스케일와 컬러영상, 두 가지 영상의 밝기를 조절해보겠습니다.

# 그레이스케일 영상 불러오기
src = cv2.imread('lenna.bmp', cv2.IMREAD_GRAYSCALE)

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

dst = cv2.add(src, 100)

# np기능 이용
# .을 붙여서 실수로 만들기, np.unit8로 부호없는 정수로 변환
#dst = np.clip(src + 100., 0, 255).astype(np.uint8)

cv2.imshow('src', src)
cv2.imshow('dst', dst)
cv2.waitKey()

# 컬러 영상 불러오기
src = cv2.imread('lenna.bmp')

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

dst = cv2.add(src, (100, 100, 100, 0))
#dst = np.clip(src + 100., 0, 255).astype(np.uint8)

cv2.imshow('src', src)
cv2.imshow('dst', dst)
cv2.waitKey()

cv2.destroyAllWindows()

 

[결과]

 

 이처럼 밝기가 변화했습니다.

 

2. 넘파이 함수를 이용한 밝기 조절 - np.clip

 np.clip을 이용하여 saturate연산을 할 수 있습니다.

 

[함수 설명]

np.clip(a, a_min, a_max, out=None)

 

[예제 코드]

# 그레이스케일
dst = np.clip(src + 100., 0, 255).astype(np.uint8)

# 컬러 영상
dst = np.clip(src + 100., 0, 255).astype(np.uint8)

 

[주의할 점]

 .을 붙여서 실수로 만들어줘야 합니다.

 데이터 타입을 np.unit8(부호가 없는 정수)로 변환해야 합니다.

 

반응형