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

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

하나의 색상 범위가 항상 맞지는 않음

조명과 그림자로 배경의 HSV 값이 달라질 수 있음. 실제 이미지의 픽셀값을 확인하며 하한과 상한을 조정해야.

Previous
마스크와 색상 기반 탐지