Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 OpenCV로 이미지 윤곽선(Contour) 찾고 그리는 방법

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로 이미지 윤곽선(Contour) 찾고 그리는 방법

정리

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