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

파이썬 scikit-learn으로 이미지 윤곽선(컨투어) 찾는 방법

scikit-learn(흔히 sklearn이라고 불림)은 파이썬에서 머신러닝 알고리즘을 구현하기 위해 널리 사용되는 라이브러리입니다. 오픈소스로 공개되어 있어 누구나 무료로 사용할 수 있으며, NumPy, SciPy, Matplotlib 라이브러리를 기반으로 만들어졌습니다.

이미지에서 윤곽선(컨투어)을 찾을 때는 '마칭 스퀘어(marching squares)' 방식이 사용됩니다. 이를 위해 skimage 라이브러리의 measure 모듈에 포함된 find_contours 함수를 활용합니다. 이 함수는 배열에 담긴 값들을 선형 보간(linear interpolation) 방식으로 처리하기 때문에, 출력 이미지에서 윤곽선의 정밀도가 훨씬 더 좋아진다는 장점이 있습니다.

또한 이미지 내에서 윤곽선들이 서로 교차하면 열린(open) 형태가 되고, 교차하지 않으면 닫힌(closed) 형태가 됩니다.

그럼 scikit-learn 계열의 skimage 라이브러리를 사용해 이미지의 윤곽선을 찾는 방법을 예제와 함께 살펴보겠습니다.

예제 코드

import numpy as np
import matplotlib.pyplot as plt
from skimage import measure

x, y = np.ogrid[-6.7:np.pi:215j, -1.2:np.pi:215j]
r = np.sin(np.exp((np.sin(x)**3 + np.cos(y)**2)))

contours = measure.find_contours(r, 0.8)

fig, ax = plt.subplots()
ax.imshow(r, cmap=plt.cm.gray)
for contour in contours:
    ax.plot(contour[:, 1], contour[:, 0], linewidth=2)
ax.axis('Image')
ax.set_xticks([])
ax.set_yticks([])
plt.show()

실행 결과

파이썬 scikit-learn으로 이미지 윤곽선(컨투어) 찾는 방법

코드 설명

  • 먼저 필요한 패키지들(numpy, matplotlib, skimage.measure)을 환경에 임포트합니다.
  • NumPy 패키지를 활용해 삼각함수 기반의 샘플 데이터를 생성합니다.
  • find_contours 함수를 호출하여 이미지 데이터의 윤곽선을 추출합니다. 여기서 두 번째 인자인 0.8은 윤곽선을 그릴 레벨(level) 값을 의미합니다.
  • subplot 관련 기능을 사용해 원본 이미지와 윤곽선이 표시된 이미지를 콘솔(화면)에 함께 시각화하여 보여줍니다.