원인은 다음과 같다.
기본적으로 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로 만들고, 병합한다. 병합한 이미지를 반환한다.
이렇게 제거됐다!!깔끔-
🔗 참고 링크