스펙트럴 클러스터링을 이용한 그리스 동전 이미지 분할

Beginner

This tutorial is from open-source community. Access the source code

소개

이 실습에서는 스펙트럴 클러스터링을 사용하여 그리스 동전 이미지를 여러 개의 부분적으로 동질적인 영역으로 분할합니다. 스펙트럴 클러스터링은 데이터 세트 내의 클러스터를 특징 간의 유사성을 기반으로 식별하는 강력한 기술입니다. 이 실습에서는 이미지에서 픽셀 간 차이를 기반으로 그래프를 생성하고 이미지를 여러 개의 부분적으로 동질적인 영역으로 나누어 이미지를 분할하는 데 스펙트럴 클러스터링을 사용합니다.

VM 팁

VM 시작이 완료되면 왼쪽 상단 모서리를 클릭하여 Notebook 탭으로 전환하여 연습을 위한 Jupyter Notebook에 접근합니다.

때때로 Jupyter Notebook 이 완전히 로드되기까지 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한으로 인해 작업의 유효성 검사를 자동화할 수 없습니다.

학습 중 문제가 발생하면 Labby 에 문의하십시오. 세션 후 피드백을 제공하면 문제를 신속하게 해결해 드리겠습니다.

이미지 로드 및 전처리

그리스 동전 이미지를 로드하고, 처리하기 쉽도록 전처리하는 것으로 시작합니다. 이미지 크기를 원본 크기의 20% 로 조정하고, 다운샘플링 전에 가우시안 필터를 적용하여 앨리어싱 아티팩트를 줄여 부드럽게 합니다.

## 동전 이미지를 NumPy 배열로 로드
orig_coins = coins()

## 처리 속도를 높이기 위해 원본 크기의 20% 로 크기 조정
## 다운샘플링 전에 가우시안 필터를 적용하여 부드럽게 함으로써
## 앨리어싱 아티팩트를 줄입니다.
smoothened_coins = gaussian_filter(orig_coins, sigma=2)
rescaled_coins = rescale(smoothened_coins, 0.2, mode="reflect", anti_aliasing=False)

이미지를 경계의 기울기 값을 가진 그래프로 변환

이미지를 경계의 기울기 값을 가진 그래프로 변환합니다. 베타 값이 작을수록 분할이 실제 이미지에 덜 의존적입니다. 베타=1 일 경우, 분할은 볼로노이 (Voronoi) 에 가깝습니다.

## 이미지를 경계의 기울기 값을 가진 그래프로 변환합니다.
graph = image.img_to_graph(rescaled_coins)

## 기울기의 감소 함수 (지수 함수) 를 적용합니다.
beta = 10
eps = 1e-6
graph.data = np.exp(-beta * graph.data / graph.data.std()) + eps

스펙트럴 클러스터링 적용

기본 eigen_solver='arpack'을 사용하여 스펙트럴 클러스터링을 적용합니다. eigen_solver='arpack', 'lobpcg', 또는 'amg' 중 어떤 구현된 솔버든 사용할 수 있습니다. eigen_solver='amg'를 선택하려면 'pyamg'라는 추가 패키지가 필요합니다. 분할의 품질과 계산 속도는 주로 솔버의 선택과 허용 오차 'eigen_tol'의 값에 따라 결정됩니다.

## 기본 eigen_solver='arpack'을 사용하여 스펙트럴 클러스터링을 적용합니다.
## 구현된 솔버 중 eigen_solver='arpack', 'lobpcg', 또는 'amg'를 사용할 수 있습니다.
## eigen_solver='amg'를 선택하려면 'pyamg'라는 추가 패키지가 필요합니다.
## 분할의 품질과 계산 속도는 주로 솔버의 선택과 허용 오차 'eigen_tol'의 값에 따라 결정됩니다.
n_regions = 26
n_regions_plus = 3
for assign_labels in ("kmeans", "discretize", "cluster_qr"):
    t0 = time.time()
    labels = spectral_clustering(
        graph,
        n_clusters=(n_regions + n_regions_plus),
        eigen_tol=1e-7,
        assign_labels=assign_labels,
        random_state=42,
    )
    t1 = time.time()
    labels = labels.reshape(rescaled_coins.shape)

분할 시각화

분할된 영역의 윤곽선을 원본 이미지에 겹쳐서 플롯하여 결과 영역을 시각화합니다.

plt.figure(figsize=(5, 5))
plt.imshow(rescaled_coins, cmap=plt.cm.gray)
plt.xticks(())
plt.yticks(())
title = "스펙트럴 클러스터링: %s, %.2fs" % (assign_labels, (t1 - t0))
print(title)
plt.title(title)
for l in range(n_regions):
    colors = [plt.cm.nipy_spectral((l + 4) / float(n_regions + 4))]
    plt.contour(labels == l, colors=colors)
plt.show()

요약

이 실험에서는 스펙트럴 클러스터링을 사용하여 그리스 동전 이미지를 여러 개의 부분적으로 동질적인 영역으로 분할했습니다. 이미지를 전처리하고, 가장자리의 기울기 값을 사용하여 그래프로 변환한 후, 스펙트럴 클러스터링을 적용하고 결과 영역을 시각화했습니다. 스펙트럴 클러스터링은 특징 간의 유사성을 기반으로 데이터 세트에서 클러스터를 식별하는 강력한 기술입니다.