Introdução
Neste laboratório, utilizaremos o agrupamento espectral para segmentar uma imagem de moedas gregas em múltiplas regiões parcialmente homogéneas. O agrupamento espectral é uma técnica poderosa que pode ser usada para identificar clusters num conjunto de dados com base na similaridade entre as suas características. Neste laboratório, utilizaremos o agrupamento espectral para segmentar uma imagem criando um grafo a partir da diferença voxel-a-voxel numa imagem e, em seguida, dividindo a imagem em múltiplas regiões parcialmente homogéneas.
Dicas da Máquina Virtual
Após o arranque da máquina virtual, clique no canto superior esquerdo para mudar para a aba Notebook para aceder ao Jupyter Notebook para a prática.
Por vezes, pode ser necessário esperar alguns segundos para o Jupyter Notebook terminar o carregamento. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.
Se tiver problemas durante o aprendizado, não hesite em contactar o Labby. Forneça feedback após a sessão e resolveremos prontamente o problema para si.
Carregar e pré-processar a imagem
Começaremos carregando a imagem das moedas gregas e pré-processando-a para facilitar o trabalho. Redimensionaremos a imagem para 20% do tamanho original e aplicaremos um filtro Gaussiano para suavização antes da redução de escala, a fim de reduzir artefactos de aliasing.
## carregar as moedas como um array numpy
orig_coins = coins()
## Redimensioná-la para 20% do tamanho original para acelerar o processamento
## Aplicar um filtro Gaussiano para suavização antes da redução de escala
## reduz artefactos de aliasing.
smoothened_coins = gaussian_filter(orig_coins, sigma=2)
rescaled_coins = rescale(smoothened_coins, 0.2, mode="reflect", anti_aliasing=False)
Converter a imagem num grafo com o valor do gradiente nas arestas
Converteremos a imagem num grafo, com o valor do gradiente nas arestas. Quanto menor for o beta, mais independente será a segmentação da imagem real. Para beta=1, a segmentação aproxima-se de uma Voronoi.
## Converter a imagem num grafo com o valor do gradiente nas
## arestas.
graph = image.img_to_graph(rescaled_coins)
## Aplicar uma função decrescente do gradiente: uma exponencial
beta = 10
eps = 1e-6
graph.data = np.exp(-beta * graph.data / graph.data.std()) + eps
Aplicar agrupamento espectral
Aplicaremos agrupamento espectral usando o solucionador padrão eigen_solver='arpack'. Qualquer solucionador implementado pode ser usado: eigen_solver='arpack', 'lobpcg' ou 'amg'. A escolha de eigen_solver='amg' requer um pacote adicional chamado 'pyamg'. A qualidade da segmentação e a velocidade dos cálculos dependem principalmente da escolha do solucionador e do valor da tolerância 'eigen_tol'.
## Aplicar agrupamento espectral usando o solucionador padrão eigen_solver='arpack'.
## Qualquer solucionador implementado pode ser usado: eigen_solver='arpack', 'lobpcg' ou 'amg'.
## A escolha de eigen_solver='amg' requer um pacote adicional chamado 'pyamg'.
## A qualidade da segmentação e a velocidade dos cálculos dependem principalmente da escolha do solucionador e do valor da tolerância '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)
Visualizar a segmentação
Visualizaremos as regiões resultantes traçando a imagem original e sobrepondo os contornos das regiões segmentadas.
plt.figure(figsize=(5, 5))
plt.imshow(rescaled_coins, cmap=plt.cm.gray)
plt.xticks(())
plt.yticks(())
title = "Agrupamento espectral: %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()
Resumo
Neste laboratório, utilizamos o agrupamento espectral para segmentar uma imagem de moedas gregas em múltiplas regiões parcialmente homogéneas. Pré-processamos a imagem, convertendo-a num grafo com o valor do gradiente nas arestas, aplicámos agrupamento espectral e visualizamos as regiões resultantes. O agrupamento espectral é uma técnica poderosa que pode ser usada para identificar clusters num conjunto de dados com base na similaridade entre as suas características.