OpenCV 강좌, Contour 검출 및 외곽선 추출

컴퓨터 비전 분야에서 이미지 처리의 핵심 기술 중 하나는 “Contour 검출”입니다. 이 기술을 통해 이미지 내 객체의 경계를 식별하고, 후속 처리나 분석을 수행할 수 있습니다. 본 강좌에서는 OpenCV를 사용하여 Contour 검출 및 외곽선 추출을 다루겠습니다.

1. Contour의 정의

Contour는 주어진 이미지에서 같은 색이나 밝기를 가진 픽셀 집합의 경계입니다. 간단한 예로, 물체의 외곽선을 검출하는 것을 나타냅니다. Contour 검출은 물체 인식, 형태 분석 등 다양한 애플리케이션에 사용됩니다.

2. OpenCV 소개

OpenCV(Open Source Computer Vision Library)는 실시간 컴퓨터 비전 및 머신 러닝 소프트웨어 라이브러리입니다. 특히, 이미지와 영상을 처리하는 데 매우 유용한 도구입니다. OpenCV는 C++, Python, Java 등 여러 언어를 지원합니다.

3. OpenCV 설치

OpenCV를 Python 환경에 설치하려면, 다음 명령어를 사용하여 간편하게 설치할 수 있습니다:

pip install opencv-python

4. Contour 검출 과정

  1. 이미지 로드
  2. 이미지 전처리 (필요한 경우)
  3. 엣지 검출
  4. Contour 검출
  5. Contour 정보 및 외곽선 시각화

5. Contour 검출 예제

5.1. 예제 코드 준비

다음의 코드는 OpenCV를 사용하여 이미지에서 Contour를 검출하는 과정을 보여줍니다:

import cv2
import numpy as np

# 이미지 로드
image = cv2.imread('image.jpg')
# 그레이스케일 변환
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 블러(Noise 감소)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
# 엣지 검출
edges = cv2.Canny(blurred, 50, 150)

# Contour 검출
contours, hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 외곽선 시각화
cv2.drawContours(image, contours, -1, (0, 255, 0), 2)

# 결과 출력
cv2.imshow('Contours', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

5.2. 코드 설명

위의 코드는 다음과 같이 작동합니다:

  • cv2.imread(): 지정된 경로에서 이미지를 로드합니다.
  • cv2.cvtColor(): 이미지를 그레이스케일로 변환합니다.
  • cv2.GaussianBlur(): 이미지를 블러 처리하여 노이즈를 줄입니다.
  • cv2.Canny(): 엣지 검출 방법 중 하나인 Canny 알고리즘을 적용하여 엣지를 검출합니다.
  • cv2.findContours(): 검출된 엣지를 바탕으로 Contour를 찾습니다. “RETR_EXTERNAL”은 외곽선만을 찾도록 설정합니다.
  • cv2.drawContours(): 검출된 Contour를 원본 이미지에 그립니다.

6. Contour 속성 분석

Contour를 검출한 후에는 각 Contour의 속성을 분석할 수 있습니다. 예를 들어, 면적, 둘레, 모양 등을 측정할 수 있습니다. 아래는 각 Contour의 면적을 계산하는 예제입니다:

for contour in contours:
    area = cv2.contourArea(contour)
    print('Contour Area:', area)

7. Contour 근사화

Contour 근사화는 복잡한 Contour를 간단한 형태로 변환하는 것을 의미합니다. 이 방법은 계산량을 줄일 수 있으며, 형태 인식에 유용합니다. 아래는 이 과정을 보여주는 코드입니다:

for contour in contours:
    epsilon = 0.01 * cv2.arcLength(contour, True)
    approx = cv2.approxPolyDP(contour, epsilon, True)
    cv2.drawContours(image, [approx], -1, (255, 0, 0), 2)

8. 다양한 응용

Contour 검출 방법은 다양한 분야에 적용될 수 있습니다. 예를 들어:

  • 객체 추적
  • 모양 분석
  • 로보틱스
  • 기계 학습 준비 데이터 생성

9. 결론

OpenCV를 사용하여 Contour 검출 및 외곽선 추출을 수행하는 방법을 배웠습니다. 이 기능은 이미지 처리 및 컴퓨터 비전의 여러 분야에서 매우 유용하게 활용될 수 있습니다. 다양한 기법과 파라미터를 조정하여 더욱 정밀한 결과를 얻을 수 있으니, 여러분만의 실험을 통해 더 많은 경험을 쌓아보세요.

10. 다음 단계

Contour 검출을 통해 더 복잡한 프로젝트를 진행해보세요. 예를 들어:

  • 다양한 객체를 인식하는 프로그램 작성
  • Contour 검출을 활용한 형태 기반 분류기 개발

이 외에도 OpenCV의 다양한 기능들을 탐험하며 더 많은 것을 배워보세요!

참고 자료