본문 바로가기

전생의 기억/영상처리

배경 분할을 어떻게 할까? (Background Substraction)

OpenCV 라이브러리에는 Background Substration과 관련된 함수가 이미 존재해요.

해당 함수에 대한 자세한 설명은 OpenCV Document를 참고하면 좋겠어요.


-링크-

https://docs.opencv.org/3.2.0/d1/dc5/tutorial_background_subtraction.html


그림을 보면, current Frame의 영상에 대해, 이전 프레임들에서 들어왔었던 영상정보를 이용하여 background model을 만들고, 이를 current Frame과 비교하게 되면 이전 프레임에 배경에 대한 정보가 있기때문에, current frame에서 이를 제외하고 구분해야할, 사람으로 치면 초점을 맞춰야할 object를 제외하고 나머지는 배경으로 인식하여 제거할 수 있어요.

그림에서는 이와 관련된 로직을 이진화를 통해 보여주고 있고, 설명은 길었지만요.. 


결과적으로는

움직이는 물체를(또는 갑자기 생긴 물체를) object로 인식한다는 뜻이에요.


그럼 이러한 배경분할이 왜 필요로 할까요?

여러 방면으로 쓰일 수 있겠지만, 저같은 경우에는 ROI(Region of Interest) 영역을 지정하는데 쓰기 위해서 관심을 가지게 되었어요.


해당 알고리즘을 통해 배경과 전경을 구분하게 되면, 결국 사람이 초점을 맞추어 특정한 오브젝트를 보는것 처럼 컴퓨터도 특정 물체를 인식하는 결과를 가져올 수 있게 되요. 물론 완벽하진 않겠죠.


그럼, 위에서는 동영상을 Input으로 해야 가능한 알고리즘인데, 저는 특정 이미지의 contrast 향상을 위해서 사용하고 싶은데, 단일 영상에 대해서는 어떤 기술을 사용해야할까요?


사실, 단일영상 (Single Image) 에 대해서 background와 foreground, 배경과 전경을 구분한다는 것은 심각하게 어려운 문제를 가지고 있어요. 사실상 이렇게 나눈다는 의미 자체가, 컴퓨터 픽셀 레벨에서는 맞지않는 개념이라고도 할 수 있죠.


그렇다면, 억지로라도 구분을 해내야 되는데, 좋은 방법이 없을까요?


외곽선 추출 기법인 convex hull, binarization 등등..

몇일전 논문을 찾다가, 이미지에서 특정 오브젝트의 salient(두드러진 특징) map 을 구해서 이를 이용하여 object를 제외한 나머지 영역을 background 영역으로 분할하는 알고리즘을 사용한 논문을 찾았어요.

------------------------------------------------------------------------------------------------

saliency 탐색은 컴퓨터 비전 분야에 다양한 분야에서 사용될 수 있어요.


saliency detection과 같이, 배경을 분할 한다는 것은 굉장히 의미있는 작업이에요.

주로 이 분야에서는 상향식 방식과 하향식 방식으로 나뉘는데요. 상향식은 사전정보(prior information)가 없는 상태로, 하향식 방식은 사전정보를 이용해여 영상을 분할하는 방식이에요.


예를 들면, 사람의 얼굴 영역을 탐색해야 할때, 사람 얼굴이 둥글다, 피부색이 살색이다. 등과 같은 사전정보들을 이용해서 얼굴을 찾게되는것이죠.

결국 이러한 사전 정보들을 입력 영상에서 추출하여 salient map을 계산해내고, 이를 이용해서 로봇공학에서 랜드마크 영역을 지정할때 사용하거나, 영상처리에서 특정 관심영역 ROI를 정할 필요가 있는 경우에 사용하게 되는것이 목적이 되는거에요.(이외에도, 영상 분할 처리, 비디오 객체 분할, 적응적 영상 압축, 영상 복원, 객체 탐색, 객체 추적, 객체 인식


그럼 salient map을 구하기 위한 사전정보들은 어떠한 것들이 있을까요?