[OpenCV-python] Contour

2018. 6. 7. 12:13Python-이론/python-opencv

Contour


contour란 같은 값을 가진 값들을 하나의 선으로 연결하는 것을 뜻한다. 예를 들어 위도나 등고선 같은 수치를 가진 것 들을 선으로 연결 할 수 있다. 


contour를 사용하기 위해선 비트값 이미지를 사용해야 하는데 이미지를 비트 값으로 만들기 위해서는 threshold나 canny를 사용해서 변경 시켜주어야 한다.  그리고 opencv에서 contours 찾기는 검은색 배경에 흰색 배경을 찾는 것이 좋습니다.  


예제코드


import cv2 img = cv2.imread('images/ironMan.PNG')

imgray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, thr = cv2.threshold(imgray, 70, 255, cv2.THRESH_BINARY)

_, countors, _ = cv2.findContours(thr, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) cv2.drawContours(img, countors, -1, (0, 255, 0), 1) cv2.imshow('thr', thr) cv2.imshow('contours', img)

cv2.waitKey(0) cv2.destroyAllWindows()


결과 



코드 설명 


imgray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, thr = cv2.threshold(imgray, 70, 255, cv2.THRESH_BINARY)


이미지를 gray컬러로 바꾼 다음  threshold해줍니다. 이 값을 findContours() 함수에 넘겨 contour를 찾습니다. 



_, countors, _ = cv2.findContours(thr, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)


이미지에서 찾는 contours와 contours의 계층 구조를 반환해줍니다. 우리는 contours에만 관심이 있기 때문에 필요없는 것들은 '_'으로 받았습니다.


thr: threshold 해준 이미지 데이터를 첫번째 인자로 집어넣는다.


cv2.RETR_TREE: 두 번째 인자는 contour 추출 모드이며, 2번째 리턴값인 hiearchy의 값에 영향을 준다.


cv2.RETR_EXTERNAL: 이미지 가장 바깥쪽의 contour만 추출

cv2.RETR_LIST: contour의 계층구조 상관관계를 고려하지 않고 contour을 추출

cv2.RETR_CCOMP: 이미지에서 모든 contour를 추출한 후, 2단계 contour 계층 구조로 구성함.

1단계 계층에서는 외곽 경계 부분을, 2단계 계층에서는 구멍(hole)의 경계 부분을 나타내는 contour러 구성됨

cv2.RETR_TREE: 이미지에서 모든 contour을 추출하고 contour들간의 상관관계를 추출함

cv2.CHAIN_APPROX_SIMPLE: 세번째 인자는 contour 근사 방법이다.


cv2.CHAIN_APPROX_NONE: contour를 추출하고 Contour들간의 상관관계를 추출함 

cv2.CHAIN_APPROX_SIMPLE: contour의 수평, 수직, 대각선 방향의 점은 모두 버리고 끝점만 만겨둠 

CHAIN_APPROX_TC89_L1: Teh_Chin 연결 근사 알고리즘을 적용함 


cv2.drawContours(img, countors, -1, (0, 255, 0), 1)


contours를 실제로 그리는 함수이다. 


img: contours를 나타낼 대상 이미지 


contours: img에서 그릴 contour cv2.findContours() 함수의 2번째 리턴 값으로 리스트형 자료이다. 


-1: img에 실제로 그릴 contours 인덱스 파라미터. 이값이 음수이면 모든 contours를 그린다. 


1: 선의 두께


참고로 global threshold보단 adaptive threshold가 더 효과적이다.


adaptive threshold를 적용했을 경우