이번 튜토리얼에서는 OpenCV를 사용해 이미지에서 윤곽선(Contour)을 검출하는 방법을 알아봅니다. 윤곽선이란 색상이나 밝기가 같은 연속된 지점들을 하나의 곡선으로 연결한 것을 의미합니다. 윤곽선은 형태 분석, 객체 검출 및 인식에 매우 유용하게 활용되는 도구입니다.
원본 이미지

알고리즘 단계
윤곽선 검출은 다음 순서로 진행됩니다.
- OpenCV 라이브러리를 임포트합니다.
- matplotlib 라이브러리를 임포트합니다.
- 이미지 파일을 읽어옵니다.
- BGR 색상 공간을 RGB로 변환합니다.
- RGB 이미지를 그레이스케일로 변환합니다.
- 그레이스케일 이미지에 임계값 처리(Thresholding)를 적용하여 이진화합니다.
- 이진 이미지에서 윤곽선을 찾습니다.
- 원본 이미지 위에 윤곽선을 그립니다.
- 최종 결과를 화면에 출력합니다.
예제 코드
import cv2
import matplotlib.pyplot as plt
image = cv2.imread('testimage.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
image = cv2.drawContours(image, contours, -1, (0, 255, 0), 2)
plt.imshow(image)
plt.show()코드 설명
cv2.cvtColor() 함수를 사용해 OpenCV 기본 색상 순서인 BGR을 RGB로 변환한 뒤, 다시 그레이스케일로 바꿉니다. 이후 cv2.threshold()로 픽셀 값을 127을 기준으로 반전 이진화하여 배경과 객체를 분리합니다. cv2.findContours()의 RETR_TREE 옵션은 모든 윤곽선의 계층 구조를 추출하며, CHAIN_APPROX_SIMPLE은 불필요한 좌표를 압축해 메모리를 절약합니다. 마지막으로 cv2.drawContours()에서 세 번째 인자를 -1로 지정하면 모든 윤곽선을 초록색((0, 255, 0))으로, 두께 2픽셀로 그릴 수 있습니다.
실행 결과
