OpenCV 이미지 밝기 및 명암 조절 (cv2.addWeighted())
1. 개요
이미지 처리에서 밝기(brightness)와 명암(contrast) 조절은 기본적인 작업 중 하나입니다. OpenCV에서는 cv2.addWeighted() 함수를 활용하여 간단하게 밝기와 명암을 조절할 수 있습니다. 이 함수는 두 개의 이미지 또는 한 개의 이미지와 스칼라 값을 가중치와 함께 합산하는 방식으로 동작합니다.
본 포스팅에서는 cv2.addWeighted() 함수의 개념을 설명하고, 이를 활용하여 이미지의 밝기와 명암을 조절하는 방법을 살펴보겠습니다.
2. cv2.addWeighted() 함수 개요
cv2.addWeighted() 함수는 다음과 같은 형식으로 사용됩니다.
cv2.addWeighted(src1, alpha, src2, beta, gamma)
파라미터 설명
src1: 첫 번째 입력 이미지 (기본 이미지)alpha: 첫 번째 이미지의 가중치 (명암 조절)src2: 두 번째 입력 이미지 (보통None또는 동일한 크기의 0 행렬 사용)beta: 두 번째 이미지의 가중치 (일반적으로0사용)gamma: 추가할 값 (밝기 조절)
이 함수는 다음과 같은 수식을 따릅니다.
[
output = src1 \times alpha + src2 \times beta + gamma
]
즉,
alpha값이 클수록 명암(contrast)이 강해지고,gamma값이 클수록 전체적으로 밝기가 증가합니다.
3. 기본 예제: 밝기 및 명암 조절
다음은 cv2.addWeighted() 함수를 사용하여 밝기와 명암을 조절하는 예제입니다.
예제 코드
import cv2
import numpy as np
def adjust_brightness_contrast(image, alpha, gamma):
# src2는 0 행렬로 설정하여 영향을 주지 않음
adjusted = cv2.addWeighted(image, alpha, np.zeros(image.shape, image.dtype), 0, gamma)
return adjusted
# 이미지 로드
image = cv2.imread("sample.jpg")
# 명암(alpha) 및 밝기(gamma) 조절
alpha = 1.5 # 명암 조절 (1.0은 원본과 동일, 1보다 크면 명암 증가, 작으면 감소)
gamma = 50 # 밝기 조절 (양수 값이면 밝아지고, 음수 값이면 어두워짐)
# 조정된 이미지 생성
adjusted_image = adjust_brightness_contrast(image, alpha, gamma)
# 결과 출력
cv2.imshow("Original Image", image)
cv2.imshow("Adjusted Image", adjusted_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
코드 설명
cv2.imread()를 사용하여 이미지를 불러옵니다.adjust_brightness_contrast()함수에서cv2.addWeighted()를 이용하여 명암(alpha)과 밝기(gamma)를 조절합니다.alpha값이 클수록 명암이 강해지며,gamma값이 클수록 이미지가 밝아집니다.cv2.imshow()를 사용하여 원본 이미지와 조정된 이미지를 출력합니다.
4. 실험: 다양한 값 적용
1) 명암 변화 실험
다음은 alpha 값을 변화시키면서 명암을 조절한 결과입니다.
| alpha 값 | 결과 |
|---|---|
| 0.5 | 명암이 줄어든 이미지 |
| 1.0 | 원본 이미지 (변화 없음) |
| 1.5 | 명암이 증가한 이미지 |
| 2.0 | 명암이 더욱 증가한 이미지 |
alpha 값이 증가하면 밝은 부분은 더 밝아지고 어두운 부분은 더 어두워져 명암이 커집니다.
2) 밝기 변화 실험
다음은 gamma 값을 변화시키면서 밝기를 조절한 결과입니다.
| gamma 값 | 결과 |
|---|---|
| -50 | 어두운 이미지 |
| 0 | 원본 이미지 (변화 없음) |
| 50 | 밝기가 증가한 이미지 |
| 100 | 더욱 밝아진 이미지 |
gamma 값이 양수이면 전체적으로 밝기가 증가하고, 음수이면 전체적으로 어두워집니다.
5. 실전 응용: 슬라이더를 활용한 밝기 및 명암 조절
사용자가 직접 alpha와 gamma 값을 조절할 수 있도록 OpenCV의 트랙바를 활용하여 인터랙티브한 UI를 만들어 보겠습니다.
예제 코드
import cv2
import numpy as np
def on_trackbar(val):
alpha = cv2.getTrackbarPos('Contrast', 'Adjustments') / 10
gamma = cv2.getTrackbarPos('Brightness', 'Adjustments') - 100
adjusted = cv2.addWeighted(image, alpha, np.zeros(image.shape, image.dtype), 0, gamma)
cv2.imshow('Adjustments', adjusted)
# 이미지 로드
image = cv2.imread("sample.jpg")
cv2.imshow('Adjustments', image)
# 트랙바 생성
cv2.createTrackbar('Contrast', 'Adjustments', 10, 30, on_trackbar)
cv2.createTrackbar('Brightness', 'Adjustments', 100, 200, on_trackbar)
cv2.waitKey(0)
cv2.destroyAllWindows()
코드 설명
cv2.createTrackbar()를 사용하여 밝기와 명암을 조절할 수 있는 슬라이더를 생성합니다.on_trackbar()함수에서 슬라이더 값(alpha와gamma)을 실시간으로 반영하여 이미지를 업데이트합니다.- 사용자가 슬라이더를 조절하면 즉시 이미지가 변경됩니다.
6. 마무리
이번 포스팅에서는 OpenCV의 cv2.addWeighted() 함수를 사용하여 이미지의 밝기와 명암을 조절하는 방법을 살펴보았습니다.
alpha값을 조정하여 명암을 조절할 수 있습니다.gamma값을 조정하여 밝기를 조절할 수 있습니다.- OpenCV 트랙바를 활용하면 사용자 입력을 받아 실시간으로 조절할 수 있습니다.
이제 OpenCV를 활용하여 다양한 이미지 처리 기법을 적용할 수 있을 것입니다.
'Python > OpenCV' 카테고리의 다른 글
| OpenCV를 활용한 엣지 검출 (Canny, Sobel, Laplacian) (0) | 2025.11.04 |
|---|---|
| OpenCV를 활용한 이미지 필터링 (블러링, 가우시안 필터, 샤프닝) (0) | 2025.11.03 |
| OpenCV 이미지 크기 조절, 회전 및 이동 (cv2.resize(), cv2.rotate(), cv2.warpAffine()) (0) | 2025.11.01 |
| OpenCV 이미지 색상 변환 (cv2.cvtColor()) (0) | 2025.10.31 |
| OpenCV로 동영상 불러오기 및 재생 (cv2.VideoCapture()) (0) | 2025.10.30 |