크로마키 합성
실습 준비
import cv2 as cv
import numpy as np
from yeom import to_pil
크로마키 합성 준비
크로마키(chroma key)는 일정한 배경색을 마스크로 선택한 뒤 다른 배경으로 교체하는 합성 방법.
foreground = cv.imread("chroma-key.jpg")

background = cv.imread("desert.jpg")

두 이미지를 픽셀별로 합성하려면 높이와 너비가 같아야 한다. 배경을 전경의 크기에 맞춤.
height, width = foreground.shape[:2] # 전경 크기를 합성 기준으로 사용
background = cv.resize(background, (width, height)) # 크기 순서는 (가로, 세로)
배경과 피사체 마스크
전경 이미지를 HSV로 변환하고 초록색 범위를 선택한다.
foreground_hsv = cv.cvtColor(foreground, cv.COLOR_BGR2HSV)
lower_green = np.array([40, 100, 100], dtype=np.uint8) # 어둡고 흐린 색 제외
upper_green = np.array([60, 255, 255], dtype=np.uint8) # 초록 계열의 H 상한
green_mask = cv.inRange(foreground_hsv, lower_green, upper_green)
green_mask: 교체할 초록 배경 영역
to_pil(green_mask)

subject_mask: 남길 피사체 영역
subject_mask = cv.bitwise_not(green_mask)
to_pil(subject_mask)

전경과 배경 합성
두 마스크로 전경과 새 배경에서 필요한 영역만 남김.
subject = cv.bitwise_and(
foreground,
foreground,
mask=subject_mask,
)
replacement = cv.bitwise_and(
background,
background,
mask=green_mask,
)
두 영역은 서로 겹치지 않으므로 픽셀별로 더하면 최종 합성 이미지가 됨.
composite = cv.add(subject, replacement)
to_pil(composite)

색상 범위 조정
적절한 HSV 범위는 조명, 카메라, 배경색에 따라 달라짐.
| 조정값 | 영향 |
|---|---|
| H 하한·상한 | 선택할 색상의 종류 |
| S 하한 | 회색이나 흰색처럼 채도가 낮은 영역의 포함 여부 |
| V 하한 | 그림자처럼 어두운 영역의 포함 여부 |
배경이 남으면 범위를 넓히고 피사체까지 사라지면 범위를 좁히며 결과를 확인.
하나의 색상 범위가 항상 맞지는 않음
조명과 그림자로 배경의 HSV 값이 달라질 수 있음. 실제 이미지의 픽셀값을 확인하며 하한과 상한을 조정해야.