Program/OPEN_CV

[Open CV] 영상 분할과 객체 검출 _ 그랩컷

사막여유 2022. 6. 12. 22:29
728x90

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 영상은 배경과 전경이 충분히 단순해야 더 좋은 결과영상을 가질 수 있다.

 

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

https://bit.ly/3L3avNW

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

728x90