Segmentação de Imagem com Agrupamento Hierárquico

Beginner

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

Introdução

Neste laboratório, aprenderemos a utilizar o agrupamento hierárquico para segmentar uma imagem 2D. O agrupamento hierárquico é um algoritmo de agrupamento que agrupa pontos de dados semelhantes. No contexto da segmentação de imagens, o agrupamento hierárquico pode ser usado para agrupar pixels com intensidades de cor semelhantes, o que pode ser útil na identificação de regiões ou objetos distintos numa imagem.

Utilizaremos a biblioteca scikit-learn do Python para realizar o agrupamento hierárquico numa imagem de moedas.

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 de carregar. 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 o problema rapidamente para si.

Gerar Dados

Começaremos gerando os dados. Usaremos o conjunto de dados coins do scikit-image, que é uma imagem 2D em escala de cinza de moedas. Redimensionaremos a imagem para 20% do tamanho original para acelerar o processamento.

from skimage.data import coins
import numpy as np
from scipy.ndimage import gaussian_filter
from skimage.transform import rescale

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 artefatos de aliasing.

smoothened_coins = gaussian_filter(orig_coins, sigma=2)
rescaled_coins = rescale(
    smoothened_coins,
    0.2,
    mode="reflect",
    anti_aliasing=False,
)

X = np.reshape(rescaled_coins, (-1, 1))

Definir a Estrutura dos Dados

Os pixels numa imagem estão conectados aos seus vizinhos. Para realizar o agrupamento hierárquico numa imagem, precisamos definir a estrutura dos dados. Podemos usar a função grid_to_graph do scikit-learn para criar uma matriz de conectividade que define a estrutura dos dados.

from sklearn.feature_extraction.image import grid_to_graph

connectivity = grid_to_graph(*rescaled_coins.shape)

Calcular o Agrupamento

Com os dados e a matriz de conectividade definidos, agora podemos realizar o agrupamento hierárquico. Usaremos a classe AgglomerativeClustering do scikit-learn para realizar o agrupamento. Definiremos o número de clusters como 27, que corresponde ao número de moedas na imagem. Usaremos o método de ligação "ward", que minimiza a variância das distâncias entre os clusters que estão a ser fundidos. Também passaremos a matriz de conectividade que criámos na etapa 2.

from sklearn.cluster import AgglomerativeClustering
import time as time

print("Calcular agrupamento hierárquico estruturado...")
st = time.time()
n_clusters = 27  ## número de regiões
ward = AgglomerativeClustering(
    n_clusters=n_clusters, linkage="ward", connectivity=connectivity
)
ward.fit(X)
label = np.reshape(ward.labels_, rescaled_coins.shape)
print(f"Tempo decorrido: {time.time() - st:.3f}s")
print(f"Número de pixels: {label.size}")
print(f"Número de clusters: {np.unique(label).size}")

Visualizar os Resultados

Finalmente, podemos visualizar os resultados numa imagem. Usaremos o matplotlib para representar a imagem redimensionada e os contornos dos clusters. Irá percorrer cada cluster e representar o contorno dos pixels nesse cluster.

import matplotlib.pyplot as plt

plt.figure(figsize=(5, 5))
plt.imshow(rescaled_coins, cmap=plt.cm.gray)
for l in range(n_clusters):
    plt.contour(
        label == l,
        colors=[
            plt.cm.nipy_spectral(l / float(n_clusters)),
        ],
    )
plt.axis("off")
plt.show()

Resumo

Neste laboratório, aprendemos como usar o agrupamento hierárquico para segmentar uma imagem 2D. Gerámos os dados, definimos a estrutura dos dados, realizámos o agrupamento hierárquico e representámos os resultados numa imagem. Esta técnica pode ser útil na identificação de regiões ou objetos distintos numa imagem.