본문 바로가기

[C++][Python]

[C++/python]OpenCV의 grab_cut 알고리즘을 이용한 배경 지우기

반응형

지난 번 사진에서 배경을 지우는 웹 홈페이지를 소개 한적이 있었습니다. 

 

해당 기능들을 제대로 사용하기 위해선 모두 유료로 금액 내고 사용해야 하므로,

 

단순히 앱의 일부 기능으로 사용하거나, 일반 사용자들에겐 부담이 될 수 있습니다. 

 

그래서 앱에 적용 시킬 수 있는 배경 지우기 기능을 찾던 도중 OpenCV의 Grab_cut 알고리즘을 알게 되었습니다.

 

그랩컷 알고리즘이란?

간단하게 이미지에서 배경과 전경(배경을 제외한 부분)을 구분하여 전경을 추출해내는 알고리즘으로 생각하면 됩니다.

 

(필자가 이해한 것으로 글을 작성한 것이므로, 설명에 부족한 부분이 있을 수도 있습니다. 너그럽게 양해 부탁드리겠습니다.  정확하게 이해를 원하시는 분은 해당 홈페이지를 통해 원문을 보고 이해하시면 됩니다.^^)

https://docs.opencv.org/3.4/d8/d83/tutorial_py_grabcut.html

 

OpenCV: Interactive Foreground Extraction using GrabCut Algorithm

Goal In this chapter We will see GrabCut algorithm to extract foreground in images We will create an interactive application for this. Theory GrabCut algorithm was designed by Carsten Rother, Vladimir Kolmogorov & Andrew Blake from Microsoft Research Cambr

docs.opencv.org

 

 

 

 

원리

 

- 전경 영역 주위에 사각형을 그려 준다.(전경 영역, 즉 사용자가 남기고 싶은 부분은 사각형 안에 포함이 되어 있어야 됨)

 

- 여기서 컴퓨터는 우리가 만들어 준 사각형으로 구분 된 배경과 전경을 구분하여 각 픽셀에  
레이블(라벨링 작업)을 지정합니다.

 

- 다음 가우시안 혼합 모델(GMM)을 이용해 모델링 과정을 거치고 새로운 픽셀 분포를 생성합니다. - 가우시안 혼합 모델 (GMM)이 전경과 배경을 모델링하는데 사용된다.

- 우리가 주었던 정보에 기반하여, GMM은 학습하고 새로운 픽셀 분포를 생성한다. 즉, 알 수 없는 픽셀은 색상 통계 측면에서 다른 하드 라벨 픽셀과의 관계에 따라 전경일 것 같은 것 또는 배경일 것 같은 것으로 표시 된다.

<자세한 설명이나 GMM에 대해서 자세히 알고 싶은 분은 아래 블로그 글을 참고 해주시면 됩니다.>

https://skkuassa.tistory.com/211

 

OpenCV GMM Gaussian Mixture Model 전배경 분리

Gaussian Mixture Model 은 전 배경 분리를 하는 방법중의 하나로서 여러개의 가우시안 확률밀도함수로 데이터의 분포를 모델링 하는 방법이다. 영상에서는 각각의 픽셀값에 해당되며 (대개 0~255 값을 지니는 밝..

skkuassa.tistory.com

 

- 여기서 알 수 없는 픽셀은 주변 픽셀과의 관계에 따라 전경 or 배경으로 표시 된다. (클러스터링 작업)

(비슷한 값을 가진 픽셀끼리  그룹을 맺는 단계라고 생각해주시면 됩니다.)

 

-이러한 과정을 반복해 사용자에게 배경을 지운 이미지를 보여 주게 됩니다.- 그래프는 이 픽셀 분포로 만들어 진다. 그래프의 노드들은 픽셀들이다. 추가적으로 Source node와 Sink node라는 두 개의 노드들이 추가 된다. 
모든 전경 픽셀은 Source node와 연결되어 있고, 모든 배경 픽셀은 Sink Node와 연결되어 있다. 

-픽셀 소스 노드/ 엔드 노드에 연결 하는 가장 자리의 가중치는 픽셀이 전경/ 배경 일 확률을 통해 정의된다. 
픽셀 사이의 가중치는 가장자리 정보나, 픽셀 유사성으로 정의 된다. 만약 픽셀 색상의 차이가 크다면, 그들 사이의 가장 자리는 낮은 가중치를 갖는다.

- 그런 다음 그래프를 분할 하는데 mincut 알고리즘을 사용한다. 이는 최소 비용 함수를 가진 두 개의 소스 노드와 싱크 노드로 그래프를 분리한다. 
비용 함수는 분리된 가장자리들의 가중치들의 합이다. 자르고 난 후, Source node와 연결 된 모든 픽셀들은 전경이 되고, Sink node와 연결 된 픽셀은 배경이 된다.

- 이 과정은 수렴할때 까지 계속 된다. 

 

-아래의 이미지와 함께 예제 링크도 같이 올려 놓았습니다. ^^

 

 

1. 먼저 다음과 같이 배경과 전경을 구분지어주는 사각형을 만들어 줍니다. 

파란색 테두리를 가진 사각형 안의 이미지 부분이 전경이 되고 밖의 이미지 부분이 배경이 됩니다.

 

 

2. 아마 첫번째 과정을 거친 이미지는 다음과 같이 완벽하게 배경이 제거 되지 않을 것이며,

사용자가 생각했던 머리 부분은 배경으로 처리되고, 발 사이 부분은 다음과 같이 남아 있을 것 입니다.

 

3. 이 때 이미지에서 내가 다시 남기고자 하는 부분, 즉 잘못 제거 된 부분은 하얀색으로, 삭제를 원하는 부분은 검은색으로 표시를 해주면 오른쪽 이미지와 같이 배경이 완벽히 제거 된 결과 값을 얻을 수 있습니다. 

 

C++ 예제 코드

<openCV에서 제공하는 예제 코드입니다.> 

https://docs.opencv.org/master/d4/d40/samples_2cpp_2watershed_8cpp-example.html#a36

 

OpenCV: samples/cpp/watershed.cpp

An example using the watershed algorithm #include #include static void help(char** argv) { cout << "\nThis program demonstrates the famous watershed segmentation algorithm in OpenCV: watershed()\n" "Usage:\n" << argv[0] <<" [image_name -- default is fruits

docs.opencv.org

<Visual Studio에 OpenCV가 설치가 안되어 있는 분이라면 아래 블로그를 참고하셔서 설치하시면 됩니다.>

https://webnautes.tistory.com/1132

 

Visual Studio 2017에서 OpenCV 4.1.1을 사용하는 방법

미리 빌드되어 배포되는 윈도우용 OpenCV 4.1.1을 Visual Studio 2017에서 사용하기 위해 필요한 과정을 설명합니다. 경험을 미루어봤을때 Visual Studio 2019에서도 빌드되어 배포되는 OpenCV를 사용할 수 있을..

webnautes.tistory.com

 

다음은 파이썬 코드입니다. 

파이선 코드의 경우 해당 블로그의 코드에 필자가 이해하기 쉽게 주석을 붙인 코드입니다.

해당 블로그에서도 코드는 복사가 안되도록 올렸기 때문에 저 역시 이미지 파일로 올립니다.!

https://m.blog.naver.com/PostView.nhn?blogId=samsjang&logNo=220606250662&proxyReferer=https%3A%2F%2Fwww.google.com%2F

 

[35편]GrabCut을 이용한 전경 추출하기

이미지 프로세싱 & 컴퓨터 비전OpenCV-Python 강좌 35편 : GrabCut 알고리즘을 이용한 전경만 추...

blog.naver.com

마찬가지로 파이선에 opencv가 설치 안되신 분들은 아래 블로그를 참고해서 설치해주세요.

https://circlestate.tistory.com/4

 

Python pip 업그레이드. opencv 설치하기

Python 모듈 설치시 pip를 업그레이드를 수행하지 않으면 필요한 모듈에 문제가 생길 수 있으니 pip를 업그레이드하고 모듈을 설치해주세요 Pip 버전 (version) 확인 pip 버전 확인 > pip --version Pip 업그레이..

circlestate.tistory.com

 

 

Web, Android, iOS 개발 문의 및 앱 웹 제작 문의 

E_mail : funidea2020@naver.com

funidea.co.kr/

 

https://funidea.co.kr/

AI 챗봇 & 사물인식 사물 인식, 인공지능 챗봇 등 Smart한 인공지능 기술을 통해 반복 업무를 줄여 보세요. 위치 기반 서비스 GPS 기능을 활용하여 현재 위치를 기준으로 주변 정보(은행, 음식점, 주�

funidea.co.kr

 

 

여성 신체 사이즈 기반 상품 추천 서비스!

나에게 딱 맞은 골라보자! Fit Me !

https://fit-me.kr/

 

핏미 - 사이즈 고민 없는 여성 쇼핑앱

더이상의 사이즈 고민은 그만! 수많은 여성 쇼핑몰을 한눈에! - 핏미

fit-me.kr

 

반응형