-
영상 분할과 객체 검출컴퓨터 비젼(Computer Vision)/영상 분할과 객체 검출 2022. 2. 16. 15:20
그랩컷
- 그래프 컷(graph cut) 기반의 영약 분할 알고리즘
- 영상의 픽셀을 그래프 정점으로 간주하고, 픽셀들을 두 개의 그룹으로 나누는 최적의 컷(Max Flow Minimun Cut)을 찾는 방식
그랩컷 영상 분할 동작 방식
- 사각형 지정 자동 분할
- 사용자가 지정한 전경/배경 정보를 활용하여 영상 분할
그랩컷 함수
cv2.grabCut(img, mask, rect, bgdModel, fgdModel, iterCount, mode=None) -> mask, bgdModel, fgdModel
- img: 입력 영상. 8비트 3채널 영상.
- mask: 입출력 마스크. cv2.GC_BGD, cv2.GC_FGD, cv2.GC_PR_BGD, cv2.GC_PR_FGD, 4 개의 값으로 구성됨. (PR: probably). cv2.GC_INIT_WITH_RECT 모드로 초기화.
- rect: ROI 영역, cv2.GC_INIT_WITH_RECT 모드에서만 사용됨.
- bgdModel: 임시 배경 모델 행렬. 같은 영상 처리 시에는 변경 금지.
- fgdModel: 임시 전경 모델 행렬. 같은 영상 처리 시에는 변경 금지.
- iterCount: 알고리즘이 수행되는 횟수.
- mode: cv2.GC_로 시작하는 모드 상수. cv2.GC_INIT_WITH_RECT로 초기화하고, cv2.GC_INIT_WITH_MASK 모드로 업데이터함.
참조
https://docs.opencv.org/3.4/d8/d83/tutorial_py_grabcut.html
예시
코드
import sys import numpy as np import cv2 # 입력 영상 불러오기 src = cv2.imread('fish.jpg') if src is None: print('Image load failed!') sys.exit() # 사각형 지정을 통한 초기 분할 rc = cv2.selectROI(src) mask = np.zeros(src.shape[:2], np.uint8) cv2.grabCut(src, mask, rc, None, None, 7, cv2.GC_INIT_WITH_RECT) # 0: cv2.GC_BGD, 2: cv2.GC_PR_BGD mask1 = np.where((mask == 0), 0, 1).astype('uint8') mask2 = np.where((mask == 0) | (mask == 2), 0, 1).astype('uint8') dst1 = src * mask1[..., np.newaxis] dst2 = src * mask2[..., np.newaxis] mask = mask*64 # 초기 분할 결과 출력 cv2.imshow('dst1', dst1) cv2.imshow('dst2', dst2) cv2.imshow('mask', mask) cv2.waitKey() cv2.destroyAllWindows()
결과물
이미지 출처:
https://seatechaquariums.com/average-lifespan-of-common-aquarium-fish/
결론
일반적인 용도로 사용할 순 없고, 빠르게 구분하기 위해 사용되는 알고리즘으로 입력 영상을 잘 줘야한다.
'컴퓨터 비젼(Computer Vision) > 영상 분할과 객체 검출' 카테고리의 다른 글
HOG 보행자 검출 (0) 2022.02.17 캐스케이드 분류기 (0) 2022.02.17 템플릿 매칭 (0) 2022.02.17 모벤트 기반 객체 검출 (0) 2022.02.16