그랩컷

매일 공부(ML)·2021년 12월 19일
0

OPEN CV

목록 보기
42/45

그랩컷

크랩컷이란?

  • 그래프 컷 기반 영역의 분할 알고리즘

  • 영상의 픽셀을 그래프 정점으로 간주하여 픽셀들을 두 개의 그룹으로 나누는 최적의 컷을 찾는 방식입니다.

그랩컷 영상 분할 동작 방식

  • 사작형 지정 자동 분할

  • 사용자가 지정한 전경/ 배경 정보를 활용하여 영상 분할하기

그랩컷 함수

cv2.grabCut(img, mask, rect, bgdModel, fgdModel, iterCount, mode=None)
-> mask, bgdModel, fgdModel
  • mg: 입력 영상. 8비트 3채널.

  • mask: 입출력 마스크. cv2.GC_BGD(0), cv2.GC_FGD(1), cv2.GC_PR_BGD(2),

  • cv2.GC_PR_FGD(3) 네 개의 값으로 구성됨.

  • 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 모드로 업데이트함.

영상 분할 예제

src = cv2.imread('nemo.jpg')

rc = cv2.selectROI(src)
mask = np.zeros(src.shape[:2], np.uint8)

cv2.grabCut(src, mask, rc, None, None, 5, cv2.GC_INIT_WITH_RECT)
# 0: cv2.GC_BGD, 2: cv2.GC_PR_BGD
mask2 = np.where((mask == 0) | (mask == 2), 0, 1).astype('uint8') # mask 행렬에서 값이 0 또는 2인 원소는
0으로, 그렇지 않은 원소는 1로 설정

dst = src * mask2[:, :, np.newaxis]

마우스를 활용한 그랩컷 영상 분할

  • 소스 코드는 예제 파일 참고: grabcut2.py

  • 초기 영역은 ROI selector 창에서 사각형 지정

  • 초기 분할 결과 dst 창에서 전경은 마우스 왼쪽 버튼 드래그(파란색), 배경은 마우스
    오른쪽 버튼 드래그(빨간색) → ENTER 키 입력 시 영상 재분할

profile
성장을 도울 아카이빙 블로그

0개의 댓글