logo

크로마키 합성

실습 준비

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 하한 그림자처럼 어두운 영역의 포함 여부

배경이 남으면 범위를 넓히고 피사체까지 사라지면 범위를 좁히며 결과를 확인.

퀴즈

문제 1 / 4맞음: 0힌트: 0틀림: 0채점중: 0남음: 4

색상은 맞지만 어두운 그림자 부분이 마스크에서 빠질 때 먼저 조정할 값은?

  • V 하한을 낮춘다
  • V 하한을 높인다
  • H 범위를 한 값으로 고정한다
  • 마스크를 3채널로 변환한다

퀴즈를 풀려면 대화형 기능을 불러와야 합니다.

Previous
마스크와 색상 기반 탐지