영상처리/OpenCV

이미지 검출 (윤곽선 검출)

성혜영 2022. 6. 8. 14:36

윤곽선 검출(Contour)

가장자리 검출 방식은 입력 이미지에서 가장자리만 검출해서 가장자리 픽셀들의 요소들은 확인 가능하나, 검출된 객체들의 세그먼트(segment) > 서로 다른 두 점을 연결하는 가장 짧은 선 구성 요소가 구분돼있지 않아 어떤 형태인지 알 수 없음. 

윤곽선 검출 알고리즘은 전처리가 진행된 이미지에서 가장자리로 검출된 픽셀을 대상으로 세그먼테이션(segmentation) > 이미지에서 각 픽셀을 분류해 그룹화 작업 진행.

검출된 윤곽선은 형상의 분석과 물체 감지 및 인식에 가장 효과적인 방법 중 하나.

 

계층구조

윤곽선 계층구조 : 세그먼테이션이 어떻게 분류됐는가에 대한 정보, 트리(Tree)구조

 

자식 노드가 여러 개일 경우 동일 레벨의 노드를 표현하는 다음 윤곽선과 이전 윤곽선으로 파악하거나 트리 구조 특성상 부모 노드는 하나만 갖게 되므로 자식 노드에서 부모 노드 확인이 가능. 계층 구조의 형태로 윤곽선(contour)인지 윤곽선 안의 홀(hole)인지 파악 가능.



윤곽선 검출

# 윤곽선 검출 함수

contours, hierarchy = cv2.findContours(

    image,

    mode,

    method,

    offset = None

)

 

윤곽선 검출 함수는 전처리가 진행된 입력 이미지(image)에서 검출된 윤곽선(contours)과 계층 구조(hierarchy)를 반환. 

검색방법(mode) : 윤곽선을 검출해 어떤 계층 구조의 형태를 사용할지 설정

근사 방법(method) : 윤곽점의 표시 방법 설정 > 근사방법에 따라 검출된 윤곽선(contours)에 포함될 좌표의 수나 정교함의 수준이 달라짐.

오프셋(offset) : 반환된 윤곽점들의 좌푯값에 이동할 값을 설정 > 관심영역에서 윤곽선을 검출하거나 다른 이미지에 표시하고자 할 때 주로 사용





검색 방법 플래그 특징

 

* External

  1. 최외곽 윤곽선만 검색하며, 내부의 홀이나 내부 윤곽은 검출하지 않음. 그러므로 계층 구조의 형태가 부모 노드와 자식 노드는 모두 -1의 값을 가짐.

* List

  1. 모든 윤곽선을 검출하며, 계층 구조를 형성하지 않음.
  2. 최외곽 윤곽선 검출 방식과 계층 구조는 동일한 형태를 갖지만 내부의 홀이나 내부 윤곽을 검출.

* CComp

  1. 모든 윤곽선을 검출하며, 2단계 계층 구조만 형성.
  2. 내부의 홀 안에 있는 윤곽은 상위 내부의 홀을 부모 노드로 갖지 않음.

* Tree

   모든 윤곽선을 검출하며, 트리 구조의 형태로 계층 구조를 형성



 

근사 방법 플래그 특징

 

* ApproxNone

  1. 검출된 윤곽선의 모든 윤곽점들을 좌푯값으로 반환
  2. 반환 된 좌푯값을 중심으로 8개의 이웃 중 하나 이상의 윤곽점들이 포함 돼 있음. (ex. 3x3 커널 구조)

* ApproxSimple

  1. 검출된 윤곽점에서 중복되는 픽셀을 제거해서 최대한 윤곽선을 그릴 때 필요한 성분만 남김
  2. 수평, 수직, 대각선 부분의 좌푯값들을 압축해서 끝 지점들만 남김.

*ApproxTC89L1                                                                   

  1. Teh-Chin 알고리즘을 적용해 반환되는 좌푯값을 중이고 더 정교한 방식으로 반환.
  2. 추가적인 매개변수를 요구하지 않음.