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()실행 결과

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