Limiarização de Imagens com RangeSlider

Beginner

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

Introdução

Este laboratório demonstrará como usar o widget RangeSlider no Matplotlib para controlar o limiar de uma imagem. O objetivo do limiar (thresholding) é converter uma imagem em tons de cinza em uma imagem binária, onde os pixels são pretos ou brancos. Isso é útil para a segmentação de imagens, onde queremos extrair certas características da imagem.

Dicas para a VM

Após a inicialização da VM, clique no canto superior esquerdo para mudar para a aba Notebook e acessar o Jupyter Notebook para praticar.

Às vezes, pode ser necessário aguardar alguns segundos para que o Jupyter Notebook termine de carregar. A validação das operações não pode ser automatizada devido às limitações do Jupyter Notebook.

Se você enfrentar problemas durante o aprendizado, sinta-se à vontade para perguntar ao Labby. Forneça feedback após a sessão, e resolveremos o problema prontamente para você.

Gerar uma imagem falsa

Primeiramente, geraremos uma imagem em tons de cinza falsa usando o módulo random do NumPy. Definiremos a semente (seed) para garantir que os resultados sejam reproduzíveis.

np.random.seed(19680801)
N = 128
img = np.random.randn(N, N)

Exibir a imagem e seu histograma

Em seguida, exibiremos a imagem usando a função imshow do Matplotlib e seu histograma usando hist. Criaremos uma figura com dois subplots, um para a imagem e outro para o histograma.

fig, axs = plt.subplots(1, 2, figsize=(10, 5))
fig.subplots_adjust(bottom=0.25)

im = axs[0].imshow(img)
axs[1].hist(img.flatten(), bins='auto')
axs[1].set_title('Histograma das intensidades dos pixels')

Criar o RangeSlider

Agora criaremos o widget RangeSlider, que nos permitirá ajustar o limiar (threshold) da imagem. Criaremos um novo eixo para o slider e o adicionaremos à figura.

slider_ax = fig.add_axes([0.20, 0.1, 0.60, 0.03])
slider = RangeSlider(slider_ax, "Threshold", img.min(), img.max())

Adicionar linhas verticais ao histograma

Para facilitar a visualização do efeito do thresholding, adicionaremos linhas verticais ao histograma para indicar os valores atuais do limiar. Criaremos duas linhas para os valores de limiar inferior e superior, respectivamente.

lower_limit_line = axs[1].axvline(slider.val[0], color='k')
upper_limit_line = axs[1].axvline(slider.val[1], color='k')

Criar uma função de callback para o slider

Criaremos uma função de callback que será chamada sempre que o usuário alterar os valores do limiar usando o slider. A função atualizará o colormap da imagem e as posições das linhas verticais no histograma.

def update(val):
    ## The val passed to a callback by the RangeSlider will
    ## be a tuple of (min, max)

    ## Update the image's colormap
    im.norm.vmin = val[0]
    im.norm.vmax = val[1]

    ## Update the position of the vertical lines
    lower_limit_line.set_xdata([val[0], val[0]])
    upper_limit_line.set_xdata([val[1], val[1]])

    ## Redraw the figure to ensure it updates
    fig.canvas.draw_idle()


slider.on_changed(update)

Exibir a figura

Finalmente, exibiremos a figura com a imagem e o slider.

plt.show()

Resumo

Neste laboratório, demonstramos como usar o widget RangeSlider no Matplotlib para controlar o limiar (thresholding) de uma imagem. Mostramos como criar uma imagem em escala de cinza (grayscale) falsa, exibi-la e seu histograma, criar um slider para ajustar os valores do limiar e atualizar a imagem e o histograma com base nos valores do slider. Essa técnica pode ser usada para segmentação de imagem e outras aplicações onde precisamos extrair certas características de uma imagem.