- 그랩컷(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()
'Computer Vision > opencv(python)' 카테고리의 다른 글
[50] 3) 템플릿 매칭(1): 이해하기 (0) | 2021.03.24 |
---|---|
[49] 2) 모멘트 기반 객체 검출 (0) | 2021.03.24 |
[47] 9) 명함 인식 프로그램 (0) | 2021.03.24 |
[46] 8) 다양한 외곽선 함수 (0) | 2021.03.24 |
[45] 7) 외곽선 검출 (0) | 2021.03.23 |