Computer Vision/opencv(python)

[48] 8.영상 분할과 객체 검출 1)그랩컷

jwjwvison 2021. 3. 24. 09:38
  • 그랩컷(GrabCut) 이란?
    • 그래프 컷(graph cut) 기반 영역 분할 알고리즘
    • 영상의 픽셀을 그래프 정점으로 간주하고, 픽셀들을 두 개의 그룹으로 나누는 최적의 컷을 찾는 방식

 

  • 그랩컷 영상 분할 동작 방식
    • 사각형 지정 자동 분할
    • 사용자가 지정한 전경/배경 정보를 활용하여 영상 분할

 

  • 그랩컷 함수
cv2.grabCut(img,mask,rect,bgdModel,fgdModel,iterCount,mode=None) -> mask, bgdModel, fgdModel

 • img: 입력 영상 . 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 모드로 업데이트함

 

  • 그랩컷 영상 분할 예제
import sys
import numpy as np
import cv2


# 입력 영상 불러오기
src = cv2.imread('t3.jpg')
src=cv2.resize(src,(1080,720))

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

#사각형 지정을 통한 초기 분할
rc=cv2.selectROI(src)   #간단한 사각형을 지정할때 이함수를 사용하는것이 편함 --> (x,y,w,h)
mask=np.zeros(src.shape[:2],np.uint8)

#None,None 인자들은 안줘도 내부에서 만들어서 사용하는데 
#계속 업데이트해서 사용하고 싶으면 인자를 주어야 한다 grab2 참고
cv2.grabCut(src,mask,rc,None,None,5,cv2.GC_INIT_WITH_RECT) 

#내가 mask를 0으로 두었지만 위함수를 통해 mask가 계속 아래 4개의 값(0~3)으로 업데이트 된다
# 0: cv2.GC_BGD, 2: cv2.GC_PR_BGD  --> 0:백그라운드인것, 2:백그라운드 인것 같은것
# 1: 확실히 포그라운드 인것, 3:포그라운드 인것 같은것
mask2=np.where((mask==0) | (mask==2),0,1).astype('uint8')  #0 또는 2인것을 0으로 세팅하고 그렇지 않으면 1로 세팅하는 함수
dst=src*mask2[:,:,np.newaxis]                              #계산을 위해 축 추가 (x,y)->(x,y,1)

# mask=mask*64
# cv2.imshow('mask',mask)
cv2.imshow('dst',dst)
cv2.waitKey()
cv2.destroyAllWindows()