OpenCV를 활용한 이미지 윤곽선 검출 개요
이미지 분석 작업에는 파이썬용 오픈소스 컴퓨터 비전 라이브러리인 OpenCV(Open Source Computer Vision Library)가 널리 사용됩니다. OpenCV를 설치한 후에는 cv2라는 이름으로 라이브러리를 임포트하여 사용할 수 있습니다.
이 글에서는 이미지 파일 속에 존재하는 윤곽선(contour)을 찾고, 이를 화면에 그려서 확인하는 방법을 소개합니다. 윤곽선은 이미지 속 사물의 형태를 식별하는 데 핵심적인 역할을 하며, 동일한 밝기(강도) 값을 가진 경계 지점들을 연결한 선으로 정의됩니다. OpenCV에서는 findContours() 함수로 윤곽선을 검출하고, drawContours() 함수로 이를 시각화할 수 있습니다.
주요 함수 문법
1. findContours – 윤곽선 검출
cv2.findContours(image, mode, method)
- image: 윤곽선을 검출할 입력 이미지
- mode: 윤곽선 검출(retrieval) 모드 — 예:
cv2.RETR_EXTERNAL(외곽 윤곽선만),cv2.RETR_LIST(전체 윤곽선) - method: 윤곽선 근사화(approximation) 방법 — 예:
cv2.CHAIN_APPROX_SIMPLE(압축 저장),cv2.CHAIN_APPROX_NONE(모든 경계 좌표 저장)
2. drawContours – 윤곽선 그리기
cv2.drawContours(img, contours, contourIdx, color, thickness)
- img: 윤곽선을 그릴 대상 이미지
- contours: 검출된 모든 윤곽선 목록
- contourIdx: 그릴 윤곽선의 인덱스. 음수(-1)를 지정하면 모든 윤곽선을 한 번에 그립니다.
- color: 윤곽선 색상 (BGR 형식의 튜플)
- thickness: 윤곽선의 두께
실전 예제
아래 예제에서는 세 개의 도형이 포함된 이미지를 입력으로 사용합니다. 먼저 이미지를 불러온 뒤, 색 공간을 변환하고 Canny 알고리즘으로 에지(edge)를 검출합니다. 이어서 검출된 에지에서 윤곽선을 찾아, 그중 원하는 윤곽선에 노란색 테두리를 그려 출력합니다.
import cv2
# 이미지 불러오기
image = cv2.imread("이미지 파일 경로")
# 색 공간 변환 (BGR → LUV)
LUV = cv2.cvtColor(image, cv2.COLOR_BGR2LUV)
# 에지 검출
edges = cv2.Canny(LUV, 10, 100)
# 윤곽선 검출
contours, hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
# 검출된 윤곽선 개수 출력
print("검출된 윤곽선 개수: " + str(len(contours)))
# 두 개의 윤곽선에 노란색 테두리 그리기
cv2.drawContours(image, contours, 0, (0, 230, 255), 6)
cv2.drawContours(image, contours, 2, (0, 230, 255), 6)
# 윤곽선이 그려진 이미지 출력
cv2.imshow('Contours', image)
cv2.waitKey(0)
실행 결과
위 코드를 실행하면 다음과 같은 결과가 콘솔에 출력됩니다.
검출된 윤곽선 개수 = 3
입력 이미지에서 세 개의 도형이 성공적으로 검출되었으며, 최종적으로 아래와 같이 일부 윤곽선 위에 노란색 테두리가 그려진 결과 이미지를 확인할 수 있습니다.

정리
OpenCV의 findContours()와 drawContours() 함수를 조합하면 이미지 속 객체의 외형을 손쉽게 추출하고 시각화할 수 있습니다. 여기에 Canny 에지 검출 등의 전처리 과정을 적절히 활용하면 더욱 정확한 윤곽선 검출이 가능하며, 이는 객체 검출, 형태 분석, 이미지 세그먼트이션 등 다양한 컴퓨터 비전 응용의 기반이 됩니다.