728x90
반응형

 

OpenCV 워터쉐드 적용하기

 

저번에는 OpenCV를 이용하여 비디오영상을 가져온 뒤, 영상에서 캐니에지를 검출해보았다. 이번에는 캐영상을 받아와 OpenCV로 전처리 과정을 거친 뒤, Watershed(워터쉐드)를 적용해보려고 한다. 먼저 워터쉐드에 대해서 알아보자.

 

WaterShed(워터쉐드)

워터쉐드는 영상 분할 알고리즘 중 하나이다. "Use of Watershed in Contour Detection"이라는 논문에서 1979년 처음 나왔다. 영상의 필섹 값을 2차원 지형으로 생각하고, 위 아래 방향에서 물을 채우는 방식이다. 

 

영상을 분할하는 방법에 있어서는 크게 2가지로 나뉜다.

1. Edge-based (윤곽선 기반 영상 분할 방법)

2. Region-based (영역 기반 영상 분할 방법)

 

첫번째 방법 같은 경우는 경계선을 기반으로 의미있는 영역들을 추출하는 방법이다. 경계선을 위주로 Detect 하다 보니 잡음에 민감하고, 끊어진 형태, 즉 폐곡선 형태의 경계선을 얻기 어려운 단점이 있다. 두번째 방법 같은 경우는 각 픽셀 간 명암도의 유사성에 기반한 방법으로 잡음이 많은 환경에서 물체를 분할하는데 적합하다. 그러나 번짐현상이 있는 영상에서 쓰기엔 적절하지 않다.

 

워터쉐드는 영역기반 알고리즘이다. 

높은 값을 갖는 픽셀들을 봉우리(Peak) 또는 워터쉐드 라인(WaterShed Line)이라고 하고, 

낮은 값을 갖는 픽셀들을 골짜기(Valley) 또는 국부 최소값(Regionalminimum)이라고 표현한다. 영상 내에서 픽셀들의 집합을 하나의 지형으로 간주하고 높낮이를 분석하는 방법이다. 

 

이는 크게 두가지 방법으로 나뉜다. 

첫번째는 Rainfall 방법인데 이는 지형의 고도가 높은 지점에서 물방울을 떨어뜨려(?) 고도가 낮은 골짜기에 물 웅덩이를 만드는 방법이고, 

두번째는 Flooding 방법인데, 물을 떨어뜨리지 않고서 고도가 낮은 골짜기부터 물을 채워 물 웅덩이를 만드는 방법이다. 

 

워터쉐드를 적용하는 과정은 다음과 같다.

 

1. 원영상(Original Image)

2. 색상공간 변환(cvColor ...)

3. 잡음 제거 (Erode)

4. 비선형 확산 및 거리 변환 (Erode, Dilate, Euclidean Distance)

5. 이진화 (Watershed)

 

 

워터쉐드의 핵심인 이진화 과정에서 각 픽셀 공간이 이진화 과정에 따라 watershed와 minima 지역으로 나뉘게 된다.

6. 기울기 계산 (Watershed)

7. 결과영상(Result Image)

 

 

 

다음은 결과는 차례대로

원영상(frame), 

침식(Foreground Image), 

팽창+이진화(Background Image), 

마커생성(Markers), 

워터쉐드(Watersheds), 

세그먼트(Segmentation) 이다.

 

움직이는 영상에서 워터쉐드를 적용하기는 쉽지 않은 것 같다. 더 강건한 알고리즘이 필요한 듯하다. 다음에는 CAMShift나 MeanShift를 이용하여 객체를 추적하는 프로그램을 짜야겠다.

 

 

 

728x90
반응형