2022.06.12 금일은 그랩컷에 관한 강의였다.
그랩컷( GrabCut ) 이란?
- 그래프 컷 ( graph cut ) 기반 영역 분할 알고리즘
- 영상의 픽셀을 그래프 정점으로 간주하고, 픽셀들을 두개의 그룹 ( 객체, 배경 )
으로 나누는 최적의 컷 ( Max Flow Minimum Cut ) 을 찾는 방식
복잡한 그래프 구조를 가상으로 만들고 2개의 그룹으로 영역, 영상분할하여 컷을 찾아내는 방식
그랩컷 영상 분할 동작 방식
- 사각형 지정 자동 분할
- 사용자가 지정한 전경/배경 정보를 활용하여 영상 분할
그랩컷 함수
cv2.grabCut ( img, mask, rect, bgdModel, fgdModel, iterCount, mode ) -> mask, bgdModel, fgdModel
img : 입력 영상. 8비트 3채널
mask : 입출력 마스크. cv2.GC_BGD(0), cv2.GC_FGD(1), cv2.GC_PR_BGD(2), cv2.GC_PR_FGC(3) 네개의 값으로 구성
cv2.GC_INIT_WITH_RCT 모드로 초기화
rect : ROI영역. cv2.GC_INIT_WITH_RECT 모드에서만 사용됨
bgdModel : 임시 배경 모델 행렬. 같은 영상 처리 시에는 변경 금지.
fgdModel : 임시 전경 모델 행렬. 같은 영상 처리 시에는 변경 금지.
iterCount : 결과 생성을 위한 반복 횟수.
mode : cv2.GC_로 시작하는 모드 상수. 보통 cv2.GC_INIT_WITH_RECT 모드로 초기화하고,
cv2.GC_INIT_WITH_MASK 모드로 업데이트함.
* Mask
위에서의 MASK 는 0부터 4까지의 네개의 값으로 구성
BGD(0) : ( BackGround ) 배경
FGD(1) : ( Forground ) 전경
BGD(2) : ( BackGround ) 배경일 것 같은거
FGD(3) : ( Forground ) 전경일 것 같은거
일단 cv2.GC_INIT_WITH_RECT 모드는 일단 사용자가 사각형의 ROI를 만들어주면 알아서 초기화하라는 인자이다.
* bgdModel, fgdModel
ndarray 형식, 줘도되고 안줘도 되지만 계속 업데이트 하는 형식으로 동작을 시킬 수 있다.한번 segmentation( 분할 ) 한 영상을 다시한번 segmentation할수도 있고 계속해서 반복하며 더 좋은 영상으로업데이트할 수 있다.
* iterCount
내부에서 몇번 연산을 거쳐서 결과영상을 보여줄지에대한 횟수
위처럼 cv2.selectROI를 사용하여 사각형의 ROI를 만들어주고
mask 라는 입력영상과 동일한 크기의 zero 영상을 만들어준다.
그리고 각인자를 grabCut 함수에 넣어준다.
mask 는 0부터 3까지의 4개의값으로 마스크 행렬을 채워준다.
이후 mask2 영상을 만드는데, 행렬에서 나온 0또는 2의값 ( BackGround ) 으로 구성해서
BackGround 인것은 0으로 셋팅하고 아닌것은 1로 셋팅을한다.
이를 src ( 입력영상 ) 에 곱해 해당 배경은 0으로 지우고 객체 ( 전경 ) 은 그대로 살려주는 영상을 구할 수 있다.
다른 코드를 구현해보면
위 코드는 복잡하여 섞여있는 영상을 로드하여 마우스 클릭이벤트로 배경과 전경을 구분해서
다시 grabCut 을 진행시켜주는 코드라고 볼 수 있다.실제 영상을 보면
위처럼 배경과 전경을 분리해주어 다시 함수를 실행시킬수록 더 좋은 결과영상을 갖출 수 있다.
하지만 많이 사용되는 함수는 아니다.
위 메시영상처럼 영상의 컬러들이 복잡해지면 마지막 결과영상처럼 제대로 분리하지 못하는 것을 볼 수 있기때문에.
따라서 grabCut 영상은 배경과 전경이 충분히 단순해야 더 좋은 결과영상을 가질 수 있다.
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr
'Program > OPEN_CV' 카테고리의 다른 글
[Open CV] 영상 분할과 객체 검출 _ 템플릿 매칭 (0) | 2022.06.14 |
---|---|
[Open CV] 영상 분할과 객체 검출 _ 모멘트 기반 객체 검출 (0) | 2022.06.13 |
[Open CV] 이진 영상 처리 _ 다양한 외곽선 함수 (0) | 2022.06.11 |
[Open CV] 이진 영상 처리 _ 외곽선 검출 (0) | 2022.06.10 |
[Open CV] 이진 영상 처리 _ 레이블링 (0) | 2022.06.09 |