Segmentação de Moedas Gregas com Agrupamento Espectral

Beginner

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

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.