Python/OpenCV

OpenCV 이미지 밝기 및 명암 조절 (cv2.addWeighted())

임베디드 친구 2025. 11. 2. 17:56
반응형

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()

코드 설명

  1. cv2.imread()를 사용하여 이미지를 불러옵니다.
  2. adjust_brightness_contrast() 함수에서 cv2.addWeighted()를 이용하여 명암(alpha)과 밝기(gamma)를 조절합니다.
  3. alpha 값이 클수록 명암이 강해지며, gamma 값이 클수록 이미지가 밝아집니다.
  4. cv2.imshow()를 사용하여 원본 이미지와 조정된 이미지를 출력합니다.

4. 실험: 다양한 값 적용

1) 명암 변화 실험

다음은 alpha 값을 변화시키면서 명암을 조절한 결과입니다.

alpha 값 결과
0.5 명암이 줄어든 이미지
1.0 원본 이미지 (변화 없음)
1.5 명암이 증가한 이미지
2.0 명암이 더욱 증가한 이미지

alpha 값이 증가하면 밝은 부분은 더 밝아지고 어두운 부분은 더 어두워져 명암이 커집니다.

2) 밝기 변화 실험

다음은 gamma 값을 변화시키면서 밝기를 조절한 결과입니다.

gamma 값 결과
-50 어두운 이미지
0 원본 이미지 (변화 없음)
50 밝기가 증가한 이미지
100 더욱 밝아진 이미지

gamma 값이 양수이면 전체적으로 밝기가 증가하고, 음수이면 전체적으로 어두워집니다.


5. 실전 응용: 슬라이더를 활용한 밝기 및 명암 조절

사용자가 직접 alphagamma 값을 조절할 수 있도록 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()

코드 설명

  1. cv2.createTrackbar()를 사용하여 밝기와 명암을 조절할 수 있는 슬라이더를 생성합니다.
  2. on_trackbar() 함수에서 슬라이더 값(alphagamma)을 실시간으로 반영하여 이미지를 업데이트합니다.
  3. 사용자가 슬라이더를 조절하면 즉시 이미지가 변경됩니다.

6. 마무리

이번 포스팅에서는 OpenCV의 cv2.addWeighted() 함수를 사용하여 이미지의 밝기와 명암을 조절하는 방법을 살펴보았습니다.

  • alpha 값을 조정하여 명암을 조절할 수 있습니다.
  • gamma 값을 조정하여 밝기를 조절할 수 있습니다.
  • OpenCV 트랙바를 활용하면 사용자 입력을 받아 실시간으로 조절할 수 있습니다.

이제 OpenCV를 활용하여 다양한 이미지 처리 기법을 적용할 수 있을 것입니다.

반응형