[opencv]grabcut 이미지의 검은 배경 없애기(투명하게 만들기)

chaewon Im·2022년 1월 30일
0

트러블슈팅

목록 보기
4/10

문제의 까만배경

grabcut을 적용해 이미지의 배경을 제거하면 이렇게 검정색 배경이 자꾸 나온다. 이렇게 되면 배경색을 처리하는 코드가 늘어날 뿐 아니라, 검정색 의류에서는 메인 색을 추출하기 더 어렵다는 문제가 생긴다.

원인은 다음과 같다.
기본적으로 rgb는 빛의 3원색인 빨강,초록,파랑을 이용해 색상을 만들어낸다. 색상'만'만들어낸다. rgba는 rgb색상과 함께 이미지의 투명도를 나타내는 알파(a) 채널이 추가된 개념이다. CSS를 많이 다뤘다면 잘 알고있을 개념이다.

나는 rgb 이미지에서 grabcut으로 배경을 제거했다. 배경을 제거했지만 투명도를 나타내는 채널은 존재하지 않았기 때문에 색상은 rgb(0,0,0)(=검정색)으로 채워진 것이다.

따라서 문제를 해결하기 위해 rgb이미지에 알파 채널을 추가하여 rgba형태의 이미지를 반환하도록 했다.


코드

def remove_grabcut_bg(self,image):
        tmp = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)
        _,alpha = cv2.threshold(tmp,0,255,cv2.THRESH_BINARY)
        r, g, b = cv2.split(image)
        rgba = [r,g,b,alpha]
        dst = cv2.merge(rgba,4)
        return dst
        
image = self.remove_grabcut_bg(image)

먼저 알파값을 생성한 후, rgb채널을 각각 분리한다. 분리된 각각의 rgb값에 alpha채널 값을 추가한 배열을 만들어 이를 rgba로 만들고, 병합한다. 병합한 이미지를 반환한다.


결과

이렇게 제거됐다!!깔끔-

🔗 참고 링크

profile
빙글빙글 돌아가는 주니어 프론트엔드 개발자

0개의 댓글