[ch02] Python 기초 사용법 - 마스크 연산과 ROI

빨주노·2021년 8월 6일
0

ROI

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

마스크 연산

  • OpenCV는 일부 함수에 대해 ROI 연산을 지원하며, 이 때 마스크 영상을 인자로 함께 전달해야함.
    • ex. cv2.copy(), cv2.calcHist(), cv2.bitwise_or(), cv2.matchTemplate(), ...
  • 마스크 영상은 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 = 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.copyTo(src, mask, dst)
  • src, mask, dst는 모두 크기가 같아야 한다.
  • src와 dst는 같은 타입이어야 하고, mask는 그레이스케일 타입의 이진 영상

Numpy의 불리언 인덱싱(boolean indexing)을 이용한 마스크 연산

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

src = cv2.imread('cat.bmp', cv2.IMREAD_COLOR)
logo = cv2.imread('opencv-logo-white.png', cv2.IMREAD_UNCHANGED)

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

cv2.copyTo(logo, mask, crop)
cv2.IMREAD_UNCHANGED

이미지 파일을 alpha channel까지 포함하여 읽어들인다. (png 파일 한정인듯 하다)

profile
딥 하게 딥러닝 하는중

0개의 댓글