pyrMeanShiftFiltering에 의한 피라미드 기반 영상 분할 (color segmentation)
피라미드(Pyrimid) 영상
일단 이 함수를 영상에 적용시키기에 앞서 피라미드 기반 영상분할에 대하여 알아야 한다. 피라미드 생성은 각각 축소와 확대로 나타난다.
pyrDown 함수 같은 경우 오리지널 영상에 가우시안 필터링을 한 후, 결과영상 사이즈를 축소한다. 보통 디폴트 값은 가로, 세로 각각을 1/2배 크기로 축소하는 것을 적용한다. 즉 Size((src.cols+1)/2, (src.rows+1)/2)가 된다.
pyrUp 함수는 마찬가지로 영상에 가우시안 필터링을 적용하여 주어진 크기로 결과영상을 확대하게 된다. 디폴트는 가로, 세로 각각 2배 크기로 확대하게 된다. 즉 Size(src.cols*2, src.rows*2) 이다.
아래와 같은 사이즈대로 피라미드 영상이 생성되는 것이다.
영상처리에 있어서 여러 스케일에 걸쳐 피라미드를 생성하여 처리를 하게 되면 물체를 비교하거나 매칭에 용이하게 쓸 수 있다. 예를들어 객체 추적 프로그램 같은 경우 다른 스케일에서 동일한 객체인지 판단할 경우에 쓰이게 된다. 즉, 각 다른 영상에서 추적하는 객체가 동일 대상인지를 알 수 있게 된다. 또한, Color Segmentation을 할 때에도 많이 쓰이게 된다. 피라미드 기반 영상분할 방법에는 대표적으로 가우시안 피라미드(Gaussian Pyramids)와 라플라시안 피라미드(Laplacian Pyramids)가 있다.
피라미드 기반 영상 분할법에는 아래와 같은 함수가 있다. 아래와 같은 함수를 이용하여 영상을 분할 해 볼 수 있다.
void pyrMeanShiftFiltering(InputArray src, OuputArray dst, double sp, double sr, intmaxLevel=1,
TermCritieria termcrit = TermCriteria(TermCriteria::MAX_ITER
+TermCriteria::EPS, 5, 1))
영상 src에서 피라미드 기반 평균 이동(Meanshift) 필터링에 의한 영상 분할 초기 단계를 수행한다. 즉, 입력영상 src의 화소(x, y)에 대하여, 공간 윈도우와 컬러 윈도우를 사용하여 반복적으로 meanshift를 수행하게 된다. (x, y)는 공간 윈도우 내의 이웃 좌표이다.
src : CV_8UC3의 8비트 3채널의 입력 컬러 영상
dst : src와 자료형과 크기가 같은 결과 영상, Meanshift에 의해 유사한 컬러 값을 갖는 화소가 같은 값
sp : 공간 윈도우의 반지름
sr : 컬러 윈도우의 반지름
maxLevel : 피라미드의 최대 레벨
termcrit : 종료를 위한 최대 반복 횟수와 오류 조건
1. 공간 윈도우와 컬러 윈도우에 의한 이웃 (x, y) 계산
X - sp <= x <= X + sp
Y - sp <= y <= Y + sp
||(R, G, B)-(r, g, b)||<= sr
2. meanshift 수행
화소 (X, Y)의 이웃에서 공간 평균 값, (X', Y')를 계산하고, 컬러 평균 값(R', G', B')값을 계산하여 다음 반복에서 이웃의 중심으로 설정한다. 반복이 종료되면, 반복의 시작 화소 (X, Y)의 값을 meanshift 수행의 마지막 컬러 평균값, (R*, G*, B*)로 저장한다.
dst(X, Y) = (R*, G*, B*)
3. 생성된 피라미드 비교
maxLevel > 0 이면 maxLevel+1의 가우시안 피라미드가 생성된다. meanshift를 하위 계층의 가우시안 피라미드에서 먼저 계산한 뒤에, 결과를 상위 계층의 가우시안 피라미드로 전달한다. 하위 게층의 피라미드에서 컬러가 sr 이상 차이가 나면, 상위 계층의 피라미드에서 다시 반복하여 계산한다.
결과화면
참고자료 : 책 OpenCV 프로그래밍 - 김동근 저
'Programming > OpenCV' 카테고리의 다른 글
[OpenCV] Bilateral Filter 적용하기 (0) | 2017.02.15 |
---|---|
[OpenCV] SimpleBlobDetector 을 이용한 Blob Detection (0) | 2017.02.08 |
[OpenCV] MOG2 함수를 이용한 배경추출 (0) | 2017.01.17 |
[OpenCV] 간단한 웹캠 영상 띄우기 및 CANNY EDGE (0) | 2017.01.17 |
OpenCV contrib 설치 및 Cmake (4) | 2016.11.14 |