코딩. 캠핑

OpenCV-Python 입문(5) - 마스크 연산과 ROI 본문

Dev(개발)/OpenCV(Python)

OpenCV-Python 입문(5) - 마스크 연산과 ROI

진영_8 2021. 2. 2. 16:37

ROI(Region of Interest)

  • 관심 영역, 영상에서 특정 연산을 수행하고자 하는 임의의 부분 영역

마스크 연산

  • OpenCV는 일부 함수에 대해 ROI 연산을 지원하며, 이때 마스크 영상을 인자로 함께 전달해야 한다.
  • 마스크 영상은 cv.CV_8UC1 타입(스레이스케일 영상)
  • 마스크 영상은 픽셀 값이 0이 아닌 위치에서만 연산이 수행됨
    -> 보통 마스크 영상으로는 0 또는 255로 구성된 이진 영상을 사용

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

cv2.copyTo(src, mask, sdt=None) -> dst
  • src : 입력영상
  • mask : 마스크 영상. cv2.CV_8U.(numpy.uint8). 0이 아닌 픽셀에 대해서만 복사 연산을 수행.
  • dst : 출력 영상. 만약 src와 크기 및 타입이 같은 dst를 입력으로 지정하면 dst를 새로 생성하지 않고 연산을 수행. 그렇지 않으면 dst를 새로 생성하여 연산을 수행한 후 반환

뭔소린지 모르겠다. 실습해보자.

import sys
import cv2


# 마스크 영상을 이용한 영상 합성
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)

cv2.imshow('src', src)
cv2.imshow('dst', dst)
cv2.imshow('mask', mask)
cv2.waitKey()
cv2.destroyAllWindows()

src영상에서 추출한 비행기 mask를 dst로 합성할 거에오. 아래 한줄만 딱 끼워주면,

cv2.copyTo(src, mask, dst)

와 짱 잘 됨.

당연한 얘기지만 src, mask, dst는 사이즈가 다 같아야하고, src, dst는 타입도 같아야한다. 컬러면 컬러, 그레이스케일이면 그레이스케일로 맞춰주고, mask는 무조건 그레이스케일이여야 한다.

 

이런 작업을 openCV에서도 할 수 있지만, 아래처럼 numpy에서 제공하는 boolean인덱싱으로도 작업할 수 있다.

dst[mask > 0] = src[mask > 0]

mask 영상에서 픽셀값이 0보다 큰 부분을 다 찾고, src에서도 0보다 큰 부분을 다 찾는다. mask > 0 의 결과는 mask 행렬과 동일한 크기의 행렬이 생성되는데, boolean값. True, False로 구성되어 있는 행렬이 반환되고, 그 행렬을 src 행렬에 대해서 인덱싱을 하게되면, True 부분에만 있는 픽셀만 가져올수 있는데, 그 픽셀값을 동일하게 dst에 세팅하는것이다.

동일하게 적용되는 것을 확인할 수 있다.

 

이번에는

이 사진을 이용해서 진행해보도록 하겠다. 

# 알파 채널을 마스크 영상으로 이용
src = cv2.imread('opencv-logo-white.png', cv2.IMREAD_UNCHANGED)
mask = src[:, :, -1]    # mask는 알파 채널로 만든 마스크 영상
src = src[:, :, 0:3]    # src는 b, g, r 3채널로 구성된 컬러 영상
dst = cv2.imread('field.bmp', cv2.IMREAD_COLOR)

h, w = src.shape[:2]

crop = dst[0:h, 0:w]    # src, mask와 같은 크기의 부분 영상 추출

cv2.copyTo(src, mask, crop)

cv2.imshow('src', src)
cv2.imshow('dst', dst)
cv2.imshow('mask', mask)
cv2.waitKey() 
cv2.destroyAllWindows()

이것도 짱 잘 됨

이렇게 투명한 png 파일도 합성이 가능하다.

Comments