[python] 이미지 윤곽선 찾기와 객체 검출하기

이미지 처리에서 윤곽선 찾기와 객체 검출은 중요한 작업입니다. 윤곽선은 이미지에서 강조된 픽셀의 외곽을 따라 그리는 선을 말하며, 객체 검출은 이미지에서 특정 객체를 식별하는 작업입니다. 이번 포스트에서는 파이썬을 사용하여 이미지 윤곽선을 찾고 객체를 검출하는 방법을 알아보겠습니다.

1. 이미지 윤곽선 찾기

이미지 윤곽선을 찾기 위해서는 먼저 이미지를 그레이스케일로 변환해야 합니다. 그 후에는 윤곽선을 찾을 수 있는 다양한 알고리즘을 적용할 수 있습니다. 예를 들면 OpenCV 라이브러리의 findContours 함수를 사용할 수 있습니다.

import cv2

# 이미지 로드
image = cv2.imread('image.jpg')

# 이미지 그레이스케일 변환
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 윤곽선 찾기
contours, _ = cv2.findContours(gray, 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()

위의 코드는 이미지를 로드하고 그레이스케일로 변환한 후 findContours 함수를 사용하여 윤곽선을 찾고, 그렇게 찾은 윤곽선을 원본 이미지에 그립니다. 마지막으로 결과 이미지를 출력합니다.

2. 객체 검출

이미지에서 특정 객체를 검출하기 위해서는 먼저 객체의 특징을 추출해야 합니다. 이를 위해 보편적으로 사용되는 방법 중 하나는 템플릿 매칭입니다. 템플릿 매칭은 특정 이미지 패턴을 찾는 기술로, OpenCV 라이브러리의 matchTemplate 함수를 사용할 수 있습니다.

import cv2
import numpy as np

# 이미지 로드
image = cv2.imread('image.jpg')

# 이미지 그레이스케일 변환
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 템플릿 로드
template = cv2.imread('template.jpg', 0)

# 템플릿 매칭
res = cv2.matchTemplate(gray, template, cv2.TM_CCOEFF_NORMED)

# 매칭 결과에서 유사도가 높은 부분 찾기
threshold = 0.8
loc = np.where(res >= threshold)

# 객체 위치 표시
for pt in zip(*loc[::-1]):
    cv2.rectangle(image, pt, (pt[0] + template.shape[1], pt[1] + template.shape[0]), (0, 0, 255), 2)

# 결과 이미지 출력
cv2.imshow('Object Detection', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

위의 코드는 이미지를 로드하고 그레이스케일로 변환한 후 템플릿을 로드합니다. matchTemplate 함수를 사용하여 이미지와 템플릿을 비교하고 유사도가 높은 부분을 찾습니다. 그리고 해당 부분에 사각형을 그려 객체 위치를 표시합니다. 마지막으로 결과 이미지를 출력합니다.

마무리

이번 포스트에서는 파이썬을 사용하여 이미지 윤곽선을 찾고 객체를 검출하는 방법에 대해 알아보았습니다. 이미지 처리 작업에서 윤곽선 찾기와 객체 검출은 다양한 분야에서 유용하게 사용되는 기술입니다. 자세한 내용은 OpenCV의 공식 문서와 예제를 참고하시면 좋습니다.

참고문서: OpenCV 공식 문서