마스크 연산 & PNG 합성

yeoni·2023년 6월 28일
0

opencv

목록 보기
7/12

마스크 연산과 ROI

관심영역(ROI)

  • Region of Interest
  • 영상에서 특정 연산을 수행하고자 하는 임의의 부분 영역

마스크연산

  • OpenCV는 일부 함수에 대해 ROI 연산을 지원하며, 이때 마스크 영상(mask image)을 인자로 함께 전달해야함
    • (e.g.) cv2.copyTo(), cv2.calcHist(), cv2.bitwise_or(), cv2.matchTemplate(), etc.
  • 마스크 영상은 cv2.CV_8UC1 타입(그레이 스케일 영상)
  • 마스크 영상의 픽셀값이 0이 아닌 위치에서만 연산이 수행됨
    • 보통 마스크 영상으로는 0 또는255로 구성된 이진영상(binary image)을 사용

마스크 연산을 지원하는 픽셀값 복사 함수

cv2.copyTo(src, mask, dst=None) -> dst
  • src: 입력 영상
  • mask: 마스크 영상. cv2.CV_8U. (numpy.uint8)0이 아닌 픽셀에대해서만 복사 연산을 수행.
  • dst: 출력 영상. 만약 src와 크기및 타입이 같은 dst를 입력으로 지정하면 dst를 새로 생성하지 않고 연산을 수행.그렇지않으면 dst를 새로 생성하여 연산을 수행한 후 반환함.
  • src, mask, dst는모두크기가같아야함. src와 dst는 같은 타입이어야 하고, mask는 그레이 스케일 타입의 이진 영상.
src = cv2.imread('airplane.bmp', cv2.IMREAD_COLOR)
mask = cv2.imread('mask_plane.bmp', cv2.IMREAD_GRAYSCALE)
dst = cv2.imread('field.bmp', cv2.IMREAD_COLOR)

# NumPy의 불리언 인덱싱(booleanindexing)을 이용한 마스크 연산
dst[mask > 0] = src[mask > 0]

투명한 PNG 파일 합성하기

import sys
import cv2


# 알파 채널을 마스크 영상으로 이용
src = cv2.imread('cat.bmp', cv2.IMREAD_COLOR)
logo = cv2.imread('opencv-logo-white.png', cv2.IMREAD_UNCHANGED)

if src is None or logo is None:
    print('Image load failed!')
    sys.exit()

mask = logo[:, :, 3]    # mask는 알파 채널로 만든 마스크 영상
logo = logo[:, :, 0:3]  # logo는 b, g, r 3채널로 구성된 컬러 영상
h, w = mask.shape[:2]
crop = src[10:10+h, 10:10+w]  # logo, mask와 같은 크기의 부분 영상 추출

# logo, mask, crop은 모두 크기가 같아야함.logo와crop는 같은 타입이어야 하고, mask는 그레이 스케일 타입의 이진영상.
cv2.copyTo(logo, mask, crop)
#crop[mask > 0] = logo[mask > 0]

Reference
1) 제로베이스 데이터스쿨 강의자료

profile
데이터 사이언스 / just do it

0개의 댓글