백인감자

[OpenCV 3.0]watershed 함수 본문

OpenCV

[OpenCV 3.0]watershed 함수

백인감자 2016. 8. 12. 15:24

watershed



- 워터쉐드 변환 : 영상을 빨리 분할해 동일한 영역으로 만들기 위해 사용하는 영상처리 알고리즘.


 - 영상이 위상적 입체감을 보여준다는 아이디어에 따름.
 - 동일한 영역은 상대적으로 급격한 에지로 기술된 평탄한 분지에 대응.
 - 즉, 워터쉐드 알고리즘의 원래 버전이 영상을 과도하게 분할해 여러 개의 작은 영역을 만든다.
 - 영상 분할에 대한 정의를 유도하는 미리 정의된 마커 집합을 사용.

 - 워터쉐드 분할은 cv::watershed 함수를 사용해 얻음.
 - 32비트 부호에 있는 정수 마커 영상으로, 레이블을 대표하는 넌제로 화소로 구성한다.
 - 영상 내의 확실히 특정 영역에 속하는 것으로 알려진 일부 화소를 마크한다.
 - 초기 레이블링에서 워터쉐드 알고리즘이 다른 화소가 속할 영역을 결정.
 - 예제에서는 그레이레벨 영상인 마커 영상을 생성한 후, 정수형 영상으로 변환.
 - 편의를 위해 이 단계를 WatershedSegmenter 클래스에 캡슐화.



예제 코드



출처: http://stackoverflow.com/questions/11435974/watershed-segmentation-opencv-xcode


분석 및 결과





erode 1회 적용



erode 5회 적용



dilate 1회 적용



dilate 5회 적용



erode: 객체 영역을 흰색으로 봤을 때 객체영역을 깎아내고 검은색 영역이 늘어남 .  객체 영역이 침식됨

dilate:  객체 영역(검은색)이 늘어나고 흰색영역(밝은영역) 이 줄어듬. 


*결과적으로 둘다 검은색영역이 늘어나는데 erode 와 dilate 에서 객체의 영역기준색깔이 반대임. 

 - 침식 : 구조 요소가 화소 위치에서 배경(즉, 교차하는 집합의 화소 하나가 검은색)을 건드렸을 때 바꿔버린다면 화소를 배경으로 보내버린다. (객체의 크기가 감소됬기 때문에 침식, 매우 작은 객체 - '잡음' 의 일부도 완전히 제거 됨)
 -  팽창 : 배경 화소로 구성된 구조 요소가 전경 객체를 건드리면 이 화소에 흰색 값을 할당. (객체의 크기는 커지며, '구멍'의 일부가 채워져 있음)



영상 추출 과정:





erode , dilate 의 경우 5번째 인자가 해당 과정의 반복횟수를 뜻하고 아래의 그림을 통해 확인할 수 있다.

[그림1]  원본 이미지


[그림2]  erode 2회 , dilate 3회 수행한 경우의 결과



[그림3]  erode 10회 , dilate 10회 수행한 경우의 결과




침식, 팽창 과정을 많이 하면  이미지가 단순하게 분할이 된다는 것을 알 수 있다.


구글링을 하다가 알게된 정보인데 

모폴로지 기법은 영상에서 잡음의 제거하거나, 영상에서 객체의 모양을 기술하는 용도로 사용된다.


  - 하지만 100% 복원되는건 아닙니다. 

    예를들어 Rect형태의 객체를 Rect 형태의 Element로 수행한다면 100% 복원가능하지만, 다른형태들은 완벽은 불가능합니다.
    

모폴로지 연산은 간단하게 침식과 팽창 연산이 있다.


침식 연산은

작은 덩어리의 객체들을 사라지게 할 수 있다. 혹은 객체의 크기를 작게 만들때 사용하기도 합니다.

 

팽창 연산은

객체 내부에 있는 작은 구멍들을 사라지게 할 수 있다. 혹은 객체의 크기를 키울때 사용하기도 한다.


라고 나와 있었다.


잡음 제거 처리를 많이 하다보니 영상이 단순화된 것 같다.





참고 블로그: http://hongkwan.blogspot.kr/2013/01/opencv-5-4-example.html



.

Comments